{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Scraper - Videos, Profiles, Comments & Hashtags",
    "description": "Scrape TikTok videos, profiles, comments, hashtags, sounds and search results. Get plays, likes, shares, captions, followers and subtitles, and download videos. Free date and popularity filters, no login or API key. Export to JSON, CSV or Excel. Pay only for results.",
    "version": "0.0",
    "x-build-id": "uhMmy1faSgFoA235S"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/briskpebble~tiktok-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-briskpebble-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/briskpebble~tiktok-scraper/runs": {
      "post": {
        "operationId": "runs-sync-briskpebble-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/briskpebble~tiktok-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-briskpebble-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",
        "properties": {
          "hashtags": {
            "title": "#️⃣ Videos with this hashtag",
            "type": "array",
            "description": "One or more hashtags, with or without the #. The scraper collects the videos TikTok lists for each hashtag: text, likes, plays, shares, author, sound and more. Use <strong>Bulk edit</strong> to paste a list.",
            "items": {
              "type": "string"
            }
          },
          "resultsPerPage": {
            "title": "💯 Number of videos per hashtag, profile, search or sound",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "How many videos to save for each hashtag, profile section, search query, sound and video's related list. The run stops paginating an input as soon as this many videos pass your filters.",
            "default": 20
          },
          "profiles": {
            "title": "Usernames",
            "type": "array",
            "description": "TikTok usernames or profile URLs, e.g. <code>nasa</code>, <code>@nasa</code> or <code>https://www.tiktok.com/@nasa</code>. You get one profile item (followers, likes, bio, emails found in the bio) plus the profile's videos.<br><br><strong>Note:</strong> since 2026 TikTok shows logged-out visitors only the newest videos of many profiles. When the full list is hidden, the scraper falls back to the creator embed (about 10 newest videos) and says so in the log.",
            "items": {
              "type": "string"
            }
          },
          "profileScrapeSections": {
            "title": "Profile sections to scrape",
            "type": "array",
            "description": "Videos the profile posted, videos it reposted, or both. Each section gets its own <strong>Number of videos</strong> limit.",
            "items": {
              "type": "string",
              "enum": [
                "videos",
                "reposts"
              ],
              "enumTitles": [
                "Videos",
                "Reposts"
              ]
            },
            "default": [
              "videos"
            ]
          },
          "includeProfileDetails": {
            "title": "Save a profile item for each username",
            "type": "boolean",
            "description": "Save one item per profile (dataType \"profile\") with follower, following, likes and video counts, bio, bio link, emails found in the bio, verified and seller flags. Turn off if you only want the videos.",
            "default": true
          },
          "excludePinnedPosts": {
            "title": "Exclude pinned posts",
            "type": "boolean",
            "description": "Skip videos the creator pinned to the top of the profile.",
            "default": false
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Keywords to search on TikTok, one per line. Any query that works in the TikTok search box works here.",
            "items": {
              "type": "string"
            }
          },
          "searchSection": {
            "title": "Top / Video / Profile section",
            "enum": [
              "",
              "/video",
              "/user"
            ],
            "type": "string",
            "description": "<strong>Top</strong> returns the videos in TikTok's Top results, <strong>Video</strong> searches videos only, <strong>Profile</strong> returns creators (one profile item each, up to <strong>Number of profiles per query</strong>).",
            "default": ""
          },
          "maxProfilesPerQuery": {
            "title": "Number of profiles per query",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Only for the Profile section: how many creators to save per search query.",
            "default": 10
          },
          "videoSearchDateFilter": {
            "title": "📅 Search: only videos posted within",
            "enum": [
              "ALL_TIME",
              "PAST_24_HOURS",
              "PAST_WEEK",
              "PAST_MONTH",
              "LAST_3_MONTHS",
              "LAST_6_MONTHS"
            ],
            "type": "string",
            "description": "Keep only search results posted within this period. Applied to every result, so it is exact.",
            "default": "ALL_TIME"
          },
          "postURLs": {
            "title": "TikTok URLs",
            "type": "array",
            "description": "Video and photo URLs (<code>https://www.tiktok.com/@user/video/123...</code>), short links (<code>vm.tiktok.com/...</code>), and profile, hashtag, sound and search URLs. Each video URL returns the full video item.",
            "items": {
              "type": "string"
            }
          },
          "scrapeRelatedVideos": {
            "title": "Scrape related videos",
            "type": "boolean",
            "description": "For each video URL above, also save the videos TikTok recommends next to it (up to <strong>Number of videos</strong> per video).",
            "default": false
          },
          "musics": {
            "title": "🎵 Videos using this sound",
            "type": "array",
            "description": "Sound URLs (<code>https://www.tiktok.com/music/name-7016547803243022337</code>) or sound IDs. Collects the videos that use each sound.",
            "items": {
              "type": "string"
            }
          },
          "oldestPostDateUnified": {
            "title": "📅 Only videos posted on or after",
            "type": "string",
            "description": "A date (<code>2026-01-31</code>), a relative time (<code>7 days</code>, <code>2 weeks</code>) or a number of days: <code>1</code> = today only, <code>2</code> = yesterday and today. On profiles, the scraper stops paginating once it reaches older videos. Free, unlike some other scrapers."
          },
          "newestPostDate": {
            "title": "📅 Only videos posted on or before",
            "type": "string",
            "description": "A date (<code>2026-01-31</code> includes the whole day) or a relative time like <code>1 day</code>."
          },
          "leastDiggs": {
            "title": "⭐ Minimum likes (hearts)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only videos with at least this many likes."
          },
          "mostDiggs": {
            "title": "⭐ Fewer likes than",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only videos with fewer likes than this, e.g. to find smaller creators."
          },
          "minPlays": {
            "title": "▶️ Minimum plays",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only videos played at least this many times."
          },
          "commentsPerPost": {
            "title": "Maximum comments per video",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Save up to this many top-level comments for every scraped video, as separate items (dataType \"comment\") with text, likes, author and reply count. 0 = no comments.",
            "default": 0
          },
          "maxRepliesPerComment": {
            "title": "Maximum replies per comment",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Also save up to this many replies for each saved comment that has replies. Replies have <code>isReply: true</code> and <code>repliesToId</code> set to the parent comment.",
            "default": 0
          },
          "shouldDownloadVideos": {
            "title": "⬇️ Download video files ($)",
            "type": "boolean",
            "description": "Save each video's MP4 file to the key-value store and add its link as <code>videoMeta.downloadedVideoUrl</code>. Charged per downloaded file.",
            "default": false
          },
          "shouldDownloadCovers": {
            "title": "Download thumbnails",
            "type": "boolean",
            "description": "Save video cover images (<code>videoMeta.downloadedCoverUrl</code>).",
            "default": false
          },
          "shouldDownloadSlideshowImages": {
            "title": "Download slideshow images",
            "type": "boolean",
            "description": "Save every image of photo posts (<code>slideshowImageLinks[].downloadLink</code>).",
            "default": false
          },
          "shouldDownloadAvatars": {
            "title": "Download profile pictures",
            "type": "boolean",
            "description": "Save authors' profile pictures (<code>authorMeta.downloadedAvatarUrl</code>).",
            "default": false
          },
          "downloadSubtitlesOptions": {
            "title": "📝 Subtitles",
            "enum": [
              "NEVER_DOWNLOAD_SUBTITLES",
              "DOWNLOAD_SUBTITLES"
            ],
            "type": "string",
            "description": "Download the subtitles TikTok has for a video (auto-generated captions or the creator's own) as WebVTT, and include their text in <code>videoMeta.subtitleLinks[].text</code>. Not every video has subtitles.",
            "default": "NEVER_DOWNLOAD_SUBTITLES"
          },
          "videoKvStoreIdOrName": {
            "title": "✍️ Name your storage for media",
            "type": "string",
            "description": "Name of the key-value store for downloaded files. Leave empty to use the run's default store, which is deleted after your plan's data retention period; a named store keeps the files until you delete it. Letters, digits and hyphens only."
          },
          "maxItems": {
            "title": "Maximum results (total)",
            "minimum": 1,
            "maximum": 10000000,
            "type": "integer",
            "description": "Total number of items (videos + profiles + comments) to save across all inputs. The run stops when it is reached, which caps the cost of a run.",
            "default": 1000
          },
          "proxyCountryCode": {
            "title": "🌐 Scrape as if in country",
            "enum": [
              "None",
              "US",
              "GB",
              "CA",
              "AU",
              "DE",
              "FR",
              "ES",
              "IT",
              "NL",
              "SE",
              "PL",
              "IE",
              "BR",
              "MX",
              "AR",
              "CO",
              "JP",
              "KR",
              "ID",
              "PH",
              "VN",
              "TH",
              "MY",
              "SG",
              "IN",
              "TR",
              "SA",
              "AE",
              "EG",
              "ZA",
              "NG"
            ],
            "type": "string",
            "description": "TikTok shows different videos, trends and availability per country. Pick a country to route the residential proxy through it. No extra charge.",
            "default": "None"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "TikTok blocks most datacenter IPs, so residential proxies are the default and strongly recommended.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "maxConcurrency": {
            "title": "Parallel browser sessions",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many TikTok sessions run in parallel, each with its own IP. More is faster but more likely to be rate-limited; 2–5 works well.",
            "default": 3
          },
          "debugLog": {
            "title": "Debug logging",
            "type": "boolean",
            "description": "Log every request and decision. Useful when reporting an issue.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}