{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Scraper - Video Search, Hashtags, Profiles & Sounds",
    "description": "Scrape TikTok videos by keyword, hashtag, profile or sound, and find creator profiles by keyword. Get views, likes, comments, shares, captions, hashtags, music, country code and author ID, bio and followers. No login or cookies needed. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "VC4zBkzP0kZDbZtmd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/clover_folktale~tiktok-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-clover_folktale-tiktok-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/clover_folktale~tiktok-scraper/runs": {
      "post": {
        "operationId": "runs-sync-clover_folktale-tiktok-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/clover_folktale~tiktok-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-clover_folktale-tiktok-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "hashtag",
              "userPosts",
              "userSearch",
              "music",
              "videoDetail",
              "profile",
              "comments",
              "followers",
              "following",
              "keywordSuggest",
              "videoAnalytics",
              "userReposts",
              "userPlaylists",
              "similarUsers",
              "soundSearch",
              "photoSearch",
              "placeSearch",
              "explore",
              "userSounds",
              "aiArticle"
            ],
            "type": "string",
            "description": "What to get: videos by keyword, hashtag, profile, sound, repost list, playlist, photo search or explore category; profiles by keyword or similar to a profile; sounds or places by keyword; the sounds a profile has made; the AI-written long text of a video; or one video's details, a profile's details, a video's comments, a profile's followers or following, search suggestions for a keyword, or a video's 14-day analytics.",
            "default": "search"
          },
          "keywords": {
            "title": "Keywords (modes: search, keywordSuggest, soundSearch, photoSearch, placeSearch)",
            "type": "array",
            "description": "Search keywords; each keyword is a separate search (or a separate suggestion lookup). Falls back to a sample keyword when empty (skincare; love for soundSearch, cats for photoSearch, paris for placeSearch). soundSearch finds the sound IDs the music mode takes.",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags (mode: hashtag)",
            "type": "array",
            "description": "Hashtags as skincare, #skincare, or a link (https://www.tiktok.com/tag/skincare). Falls back to \"skincare\" when empty.",
            "items": {
              "type": "string"
            }
          },
          "profiles": {
            "title": "Profiles (modes: userPosts, profile, followers, following, userReposts, userPlaylists, similarUsers, userSounds)",
            "type": "array",
            "description": "Public profiles as khaby.lame, @khaby.lame, or a link to the profile or to one of its videos. Short vm.tiktok.com, vt.tiktok.com or tiktok.com/t/ links are not supported. Falls back to \"khaby.lame\" when empty (\"mrbeast\" for userPlaylists, \"taylorswift\" for userSounds).",
            "items": {
              "type": "string"
            }
          },
          "userKeywords": {
            "title": "Keywords (mode: userSearch)",
            "type": "array",
            "description": "Search keywords; each keyword is a separate profile search. Falls back to \"skincare\" when empty.",
            "items": {
              "type": "string"
            }
          },
          "musics": {
            "title": "Sounds (mode: music)",
            "type": "array",
            "description": "Sound IDs (7016547803243022337) or links such as https://www.tiktok.com/music/Face-Off-7016547803243022337. Falls back to a sample sound when empty.",
            "items": {
              "type": "string"
            }
          },
          "sortType": {
            "title": "Sort by (mode: search)",
            "enum": [
              "relevance",
              "most-liked",
              "latest"
            ],
            "type": "string",
            "description": "Order of the search results. Latest favours recent videos but is not strictly by date. If a keyword runs out before Max results, the rest comes from TikTok's general video results, most liked first; with a publish period there is no such top-up.",
            "default": "relevance"
          },
          "publishTime": {
            "title": "Published within (mode: search)",
            "enum": [
              "all",
              "day",
              "week",
              "month",
              "3months",
              "6months"
            ],
            "type": "string",
            "description": "Only videos published in this period.",
            "default": "all"
          },
          "region": {
            "title": "Region (mode: search)",
            "type": "string",
            "description": "Two-letter country code sent with the search, such as US, GB or DE. TikTok treats it as a hint: results can still include videos labelled with other countries (see the region field of each video).",
            "default": "US"
          },
          "videos": {
            "title": "Videos (modes: videoDetail, comments, videoAnalytics, aiArticle)",
            "type": "array",
            "description": "Video IDs (7694335322922044703) or full video links (https://www.tiktok.com/@khaby.lame/video/7694335322922044703). Short vm.tiktok.com, vt.tiktok.com or tiktok.com/t/ share links work in videoDetail mode; for comments, videoAnalytics and aiArticle open them and copy the full link. Falls back to a sample video when empty.",
            "items": {
              "type": "string"
            }
          },
          "includeReplies": {
            "title": "Include replies (mode: comments)",
            "type": "boolean",
            "description": "Also collect the replies of comments that have 3 or more replies. Replies are delivered right after their comment, count toward the limit for that video, and are charged like comments.",
            "default": false
          },
          "includeFakeViewScore": {
            "title": "Fake-view check (mode: videoAnalytics)",
            "type": "boolean",
            "description": "Also run a fake-view check on each video whose analytics were found. It adds one extra record per video, charged at $0.03 (the 'audit' event).",
            "default": false
          },
          "includeMilestones": {
            "title": "Creator milestones (mode: profile)",
            "type": "boolean",
            "description": "Also fetch the creator figures and growth milestones (such as reached 1M followers, with the top videos of each stage) for each profile with 1,000 followers or more. It adds one extra record per profile, charged at $0.002 (the 'detail' event) only when it is found. Profiles are then read one at a time.",
            "default": false
          },
          "includeCountry": {
            "title": "Account country (mode: profile)",
            "type": "boolean",
            "description": "Also fetch the country the account is registered in. It adds one extra record per profile, charged at $0.002 (the 'detail' event) only when it is found. Profiles are then read one at a time.",
            "default": false
          },
          "includeSoundDetail": {
            "title": "Sound details (mode: soundSearch)",
            "type": "boolean",
            "description": "Also fetch a detail record for each sound found (album, release date, theme tags, commercial-use flag). It adds one extra record per sound, charged at $0.002 (the 'detail' event) only when the details were found.",
            "default": false
          },
          "searchKeyword": {
            "title": "Search inside the list (modes: followers, following)",
            "type": "string",
            "description": "Search the followers (or the followed accounts) of each profile for a name instead of listing them. Returns up to 50 matching accounts per profile, charged like the plain lists ($0.001 each, the 'lite' event). A profile with no match costs you nothing. If 3 profiles in a row find nothing, the search stops for the rest of the run and the status says so. At least 4 matches per profile are returned when there are that many, whatever the limit says. Leave empty to list the followers or following."
          },
          "maxResults": {
            "title": "Max results per input",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum items for each keyword, hashtag, profile, sound, video or category (up to 1000). Video details, profile details and analytics return one record per input, so the limit rarely matters there. A search inside followers or following returns at least 4 per profile, and `userSounds` at least 2. Prices per item are in the pricing section: $0.003 per video, user, sound or analytics record (explore videos: $0.001), $0.002 per video detail, profile or suggestion, $0.001 per comment, follower, followed account or place, $0.03 per fake-view check, plus a $0.00005 start fee (per input for every mode except video detail, profile and analytics, which pay it once per run).",
            "default": 20
          },
          "exploreCategories": {
            "title": "Categories (mode: explore)",
            "type": "array",
            "description": "Explore categories; each one is a separate input. TikTok serves a random selection of its explore feed per request, so repeated requests bring more videos until they stop bringing new ones. Falls back to food when empty.",
            "items": {
              "type": "string",
              "enum": [
                "all",
                "animation-comics",
                "performance",
                "beauty-care",
                "gaming",
                "comedy",
                "daily-life",
                "family",
                "relationships",
                "drama",
                "fashion",
                "lip-sync",
                "food",
                "sports",
                "animals",
                "society",
                "cars",
                "education",
                "fitness-health",
                "tech",
                "singing-dancing"
              ],
              "enumTitles": [
                "All",
                "Animation comics",
                "Performance",
                "Beauty care",
                "Gaming",
                "Comedy",
                "Daily life",
                "Family",
                "Relationships",
                "Drama",
                "Fashion",
                "Lip sync",
                "Food",
                "Sports",
                "Animals",
                "Society",
                "Cars",
                "Education",
                "Fitness health",
                "Tech",
                "Singing dancing"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}