{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Scraper – Videos, Profiles, Hashtags, Comments & API",
    "description": "🔥 $0.50/1K results🔥 Scrape TikTok videos, profiles, hashtags, search results, comments, subtitles, sounds, live streams, and media. Filter and sort results, download videos, export structured data, or use the TikTok Scraper API. No login, cookies, or proxy setup required.",
    "version": "1.14",
    "x-build-id": "SmQZLppMVfB5sbjPY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/poidata~tiktok-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-poidata-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/poidata~tiktok-scraper/runs": {
      "post": {
        "operationId": "runs-sync-poidata-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/poidata~tiktok-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-poidata-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": "#️⃣ Hashtags to scrape",
            "type": "array",
            "description": "One hashtag per line. The leading `#` is optional — `fyp` and `#fyp` behave the same.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "🎬 Videos to collect",
            "minimum": 0,
            "type": "integer",
            "description": "The total number of videos for the whole run, across every input list. Error rows are not counted. The run stops as soon as this number is reached.",
            "default": 100
          },
          "maxItemsPerQuery": {
            "title": "🎬 Videos per query",
            "minimum": 0,
            "type": "integer",
            "description": "Caps each query separately instead of the run as a whole. Leave 0 to derive each query's cap from **🎬 Videos to collect** — at least 12 and at most 200 per query, so one large query cannot crowd out the rest.",
            "default": 0
          },
          "uniqueAuthors": {
            "title": "One video per creator",
            "type": "boolean",
            "description": "Keeps only the first video seen from each creator and discards the rest. Useful for discovering new accounts inside a hashtag.",
            "default": false
          },
          "profiles": {
            "title": "Profile handles",
            "type": "array",
            "description": "One username per line, with or without the `@`. By default this returns that creator's videos. Put `user:` in front — `user:mrbeast` — to collect the profile's own details instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "enrichProfiles": {
            "title": "Fetch follower counts per profile",
            "type": "boolean",
            "description": "Spends one extra request per profile to fill in follower, following and video counts, charged per profile filled. Slower and billable, but without it those numbers come back empty on search results.",
            "default": false
          },
          "excludePinnedPosts": {
            "title": "Skip pinned videos",
            "type": "boolean",
            "description": "Leave out a profile's pinned videos. TikTok only reports the pinned flag on profile feeds, so this affects profile video results only.",
            "default": false
          },
          "maxFollowers": {
            "title": "🗂️ Maximum followers per profile",
            "minimum": 0,
            "type": "integer",
            "description": "Drops accounts above this size, which surfaces smaller creators. 0 turns it off.",
            "default": 0
          },
          "minFollowers": {
            "title": "🗂️ Minimum followers per profile",
            "minimum": 0,
            "type": "integer",
            "description": "Drops accounts below this size. Profile results only. 0 turns it off.",
            "default": 0
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "One keyword or phrase per line. Each one is searched on TikTok and returns matching videos.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Result ordering",
            "enum": [
              "relevance",
              "latest",
              "popular"
            ],
            "type": "string",
            "description": "**Relevance** leaves TikTok's own ranking untouched. Ordering happens after fetching, so it applies to hashtag and profile results too. Newest-first and Most-played-first re-order each query's results and are billed as `sorted-search` — one per query.",
            "default": "relevance"
          },
          "maxLikes": {
            "title": "⭐ Maximum likes per video",
            "minimum": 0,
            "type": "integer",
            "description": "Drops videos with more likes than this, which is useful for finding niche or low-competition content. 0 turns it off.",
            "default": 0
          },
          "minLikes": {
            "title": "⭐ Minimum likes per video",
            "minimum": 0,
            "type": "integer",
            "description": "Drops videos with fewer likes than this. 0 turns it off. Using any filter in this section widens the fetch to find enough survivors and is billed as `filtered-search` — one per query.",
            "default": 0
          },
          "minPlayCount": {
            "title": "⭐ Minimum views per video",
            "minimum": 0,
            "type": "integer",
            "description": "Drops videos with fewer plays than this. 0 turns it off.",
            "default": 0
          },
          "dateFrom": {
            "title": "📅 Posted on or after",
            "type": "string",
            "description": "Keeps videos published from this date onwards. Leave empty to turn it off. Date filters bill `filtered-search` — one per query.",
            "default": ""
          },
          "dateTo": {
            "title": "📅 Posted on or before",
            "type": "string",
            "description": "Keeps videos published up to this date. Leave empty to turn it off.",
            "default": ""
          },
          "postURLs": {
            "title": "TikTok links to scrape",
            "type": "array",
            "description": "One URL per line. Video, profile, hashtag, sound and short (`vm.` / `vt.`) links all work — short links are followed to their full URL for you.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeSubtitles": {
            "title": "Fetch captions",
            "type": "boolean",
            "description": "For each video, pulls the caption tracks TikTok holds and adds them as `subtitles` — the raw WebVTT plus a `plain` text version. A video often has captions in more than one language; each track arrives separately with its own `lang`, so you can pick the one you want. `source` says whether TikTok generated the track (`ASR`) or the creator uploaded it. Videos with no captions simply return none.",
            "default": false
          },
          "includeComments": {
            "title": "Fetch comments",
            "type": "boolean",
            "description": "For each video, pulls its comments and writes them out as separate `type: \"comment\"` rows in the dataset, tagged `type: comment`. Comments do **not** count towards **🎬 Videos to collect**. Costs about one extra API call per video.",
            "default": false
          },
          "commentsPerPost": {
            "title": "Comments per video",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "How many top-level comments to pull per video when **Fetch comments** is on. Replies TikTok returns inline are added on top. 0 or unset means 50.",
            "default": 50
          },
          "downloadVideos": {
            "title": "Save video files",
            "type": "boolean",
            "description": "Downloads each video and links the stored file on every video row as `mediaUrls` (plus `downloadedCover`, `downloadedAvatar` and `downloadedSoundCover` for the extras below). Stored files stay available for 48 hours by default — long enough to collect them during or shortly after the run, but not a permanent archive. TikTok's own CDN links expire within hours. Photo posts (slideshows) are stored as their rendered video plus cover — TikTok's web interface exposes no per-slide images.",
            "default": false
          },
          "downloadThumbnails": {
            "title": "Include thumbnails",
            "type": "boolean",
            "description": "Stores each video's cover frame alongside the video and links it on the row as `mediaUrls` and `coverUrl`.",
            "default": true
          },
          "downloadProfileAvatars": {
            "title": "Include profile avatars",
            "type": "boolean",
            "description": "Stores the creator's profile picture alongside their video and links it on the row.",
            "default": true
          },
          "downloadSoundCovers": {
            "title": "Include sound covers",
            "type": "boolean",
            "description": "Stores the square artwork of the sound used in each video and links it on the row.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}