{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Scraper: Hashtag, Search & Trending Videos, No Login",
    "description": "Scrape TikTok videos by hashtag, keyword search or trending feed: plays, likes, shares, saves, comments, caption, music and author followers. Free date filter, optional MP4 download and a views vs creator median score to spot viral videos. No login or cookies. Works via API and MCP.",
    "version": "0.1",
    "x-build-id": "qtbQ9eWA2Ybh7bwRA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/themineworks~tiktok-hashtag-search-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-themineworks-tiktok-hashtag-search-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/themineworks~tiktok-hashtag-search-scraper/runs": {
      "post": {
        "operationId": "runs-sync-themineworks-tiktok-hashtag-search-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/themineworks~tiktok-hashtag-search-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-themineworks-tiktok-hashtag-search-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": {
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "TikTok hashtags to scrape, one per line, with or without the # (for example jewelrytok or #engagementring). A tiktok.com/tag/... link also works. Since late October 2026 TikTok shows its full hashtag feed only to logged-in accounts, so each hashtag is read from the public pages that still answer: first the hashtag page's top videos (about 10, all carrying the tag), then TikTok's topic page for the same word (tiktok.com/discover/jewelrytok, about 80 to 100 videos), then related topic pages. Each row's dataSource says which page it came from.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "Search terms, one per line (for example lab grown diamond ring). A tiktok.com/search?q=... link also works. Since late October 2026 TikTok's search answers only logged-in accounts, so each term is read from TikTok's public topic page for it (tiktok.com/discover/lab-grown-diamond-ring), then from related topic pages. Each row's dataSource says which page it came from. Sort order, date window and photo posts are in the Keyword options section below.",
            "items": {
              "type": "string"
            }
          },
          "trending": {
            "title": "Trending videos",
            "type": "boolean",
            "description": "Also scrape the videos TikTok's Explore page is currently showing (its trending feed) for the category below. Each call is a fresh draw, so repeated runs return different videos. If the Explore feed refuses, TikTok Creative Center's top videos (US) are used instead.",
            "default": false
          },
          "trendingCategory": {
            "title": "Trending category",
            "enum": [
              "120",
              "119",
              "104",
              "112",
              "100",
              "107",
              "101",
              "110",
              "105",
              "102",
              "103",
              "114",
              "109",
              "115",
              "111",
              "113",
              "106",
              "108",
              "117",
              "116",
              "118"
            ],
            "type": "string",
            "description": "Explore page category used when Trending videos is on.",
            "default": "120"
          },
          "maxItems": {
            "title": "Max videos per input",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Most videos to return for EACH hashtag, keyword and the trending feed. One topic page holds about 80 to 100 videos; with Related topic pages on, more come from related topics. A term with few public pages can return fewer; the run summary (OUTPUT) reports every page read. You only pay for videos delivered.",
            "default": 50
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep only videos posted in the last N days, based on each video's createTime. Older videos are skipped and never charged. Leave empty for no date filter."
          },
          "minPlays": {
            "title": "Minimum plays",
            "minimum": 0,
            "type": "integer",
            "description": "Skip videos with fewer plays than this, for every hashtag, keyword and the trending feed. Skipped videos are never charged. Leave empty for no minimum."
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Skip videos with fewer likes than this, for every input. Skipped videos are never charged. Leave empty for no minimum."
          },
          "region": {
            "title": "Region",
            "enum": [
              "US"
            ],
            "type": "string",
            "description": "Country TikTok is browsed from. Only the United States is available: TikTok refuses its web video pages to logged out visitors from the UK, EU, Canada, Australia, Brazil, Japan and Mexico, and TikTok is not available in India. Videos from creators anywhere still appear.",
            "default": "US"
          },
          "downloadVideos": {
            "title": "Download video files (MP4)",
            "type": "boolean",
            "description": "Save each video's MP4 to this run's key-value store and put a public link to it in videoFileUrl. TikTok's own videoUrl only plays with TikTok session cookies, so this is the way to get a file you can open anywhere. Charged per file actually saved; a failed download is not charged. Slideshow (photo) posts have no MP4 and are skipped.",
            "default": false
          },
          "includeAuthorMedianPlays": {
            "title": "Add author median plays",
            "type": "boolean",
            "description": "For each unique author, read their most recent posts and add authorMedianPlays (the median play count of those posts) and playsVsAuthorMedian (this video's plays divided by that median). A value of 3 means the video did three times the author's usual. Fetched once per author per run.",
            "default": false
          },
          "searchSortBy": {
            "title": "Sort keyword results by",
            "enum": [
              "relevance",
              "most_liked",
              "latest"
            ],
            "type": "string",
            "description": "Most liked or Latest: the actor reads the whole topic page for the keyword first and sorts it before delivering, so the first rows are the most liked (or newest) posts on that page. Relevance keeps TikTok's own order.",
            "default": "relevance"
          },
          "searchDatePosted": {
            "title": "Keyword results posted within",
            "enum": [
              "any",
              "last_24_hours",
              "last_week",
              "last_month",
              "last_3_months",
              "last_6_months"
            ],
            "type": "string",
            "description": "Keep only keyword results posted inside this window (by each video's posted time). Leave it on Any time to let Posted within the last N days decide. Older videos are skipped and never charged.",
            "default": "any"
          },
          "searchContentType": {
            "title": "Keyword result type",
            "enum": [
              "videos",
              "photos"
            ],
            "type": "string",
            "description": "Videos keeps video posts only. Photo posts keeps carousel and slideshow posts only, with their pictures in imageUrls (topic pages hold few of them).",
            "default": "videos"
          },
          "deepSearch": {
            "title": "Related topic pages",
            "type": "boolean",
            "description": "When a hashtag's or keyword's own pages end before Max videos per input, also read related topic pages: TikTok's related topic words for it, then topic words from its search suggestions. This also finds videos for a word that has no topic page of its own (for example skincare). Rows from them have dataSource related_topic_page. A video found twice is delivered and charged once. Switch it off to keep only the term's own pages.",
            "default": true
          },
          "includeSuggestions": {
            "title": "Add search suggestions (free)",
            "type": "boolean",
            "description": "Also read TikTok's autocomplete suggestions and related questions for each keyword and hashtag. Free: they are saved to the SUGGESTIONS record of the run (and the OUTPUT summary), not to the dataset, and are never charged.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}