TikTok Search Scraper avatar

TikTok Search Scraper

Pricing

from $1.60 / 1,000 results

Go to Apify Store
TikTok Search Scraper

TikTok Search Scraper

Scrape all public TikTok videos that use a given music/sound URL. Get captions, stats, covers, author profiles, and music details with pagination and proxy support.

Pricing

from $1.60 / 1,000 results

Rating

0.0

(0)

Developer

Alien Force

Alien Force

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Categories

Share

Overview

Scrape TikTok search results by keyword — videos, photos, or users — in one Apify Actor.

The TikTok Search Scraper turns any public TikTok search query into clean, structured data: captions, views, likes, covers, music, author profiles, and more. Use it for content research, trend monitoring, influencer discovery, competitor tracking, or bulk export to CSV/JSON and your own pipelines.

Whether you need TikTok video search results, photo/carousel posts, or user profiles matching a keyword, you get paginated results with optional sort and date filters — without manual scrolling.

Key Features

  • TikTok keyword search scraper: Run one search query and pull public results at scale.
  • Videos, photos, and users: Scrape TikTok search tabs for video posts, image posts, or creator profiles.
  • Trend & content research ready: Capture captions, engagement stats, covers, play URLs, and music metadata.
  • Influencer / user discovery: Find TikTok accounts by keyword with follower counts, bios, and profile links.
  • Sort and date filters: Relevance, most liked, or latest — plus date-posted windows (videos and photos).
  • Pagination to your limit: Keep fetching until you hit your max results or TikTok runs out of pages.
  • Proxy support: Datacenter proxies by default; switch to residential if TikTok starts blocking.
  • Clear run reporting: Empty or blocked outcomes stay out of the dataset and show up in logs / a key-value report.

Input Schema

Input Properties

  1. searchQuery

    • Type: string (required)
    • Description: Keyword or phrase to search on TikTok (single query per run).
    • Example: "the rock"
  2. searchType

    • Type: string
    • Description: Which search results to scrape: videos, photos, or users. Default is videos.
    • Example: "videos"
  3. limit

    • Type: integer
    • Description: Maximum number of results to scrape for the run. Set to 0 for no soft cap (the run still stops when TikTok reports no more results). Default is 10.
    • Example: 100
  4. sortType

    • Type: string
    • Description: Sort preference for videos and photos: relevance, mostLiked, or latest. Default is relevance. Ignored for users.
    • Example: "mostLiked"
  5. datePosted

    • Type: string
    • Description: Publish-time filter for videos and photos: all, 24h, week, month, 3months, or 6months. Default is all. Ignored for users.
    • Example: "week"
  6. proxyConfiguration

    • Type: object
    • Description: Use Apify RESIDENTIAL proxies. Optionally pick a Country in the proxy dropdown — that ISO code drives TikTok region / timezone so they match the exit IP (full Apify residential country list supported).
    • Example:
      { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }

searchQuery is required.

Input Example

{
"searchQuery": "the rock",
"searchType": "videos",
"limit": 100,
"sortType": "relevance",
"datePosted": "all",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Output

One dataset row per result. The shape depends on searchType.

Common fields

FieldTypeDescription
searchTypestringvideos, photos, or users
searchQuerystringSearch query used for the run

Videos (searchType: "videos")

FieldTypeDescription
idstringVideo ID
descstring | nullCaption
createTimeinteger | nullCreate time (Unix timestamp, seconds)
urlstring | nullCanonical video URL
authorobject | nullAuthor details (id, uniqueId, nickname, signature, verified, avatarThumb, secUid)
statsobject | nullEngagement (diggCount, shareCount, commentCount, playCount, collectCount)
musicobject | nullMusic / sound (id, title, authorName, playUrl)
videoobject | nullMedia (id, duration, cover, playAddr, downloadAddr, width, height)

Photos (searchType: "photos")

Same as videos for id, desc, createTime, url, author, stats, and music, plus:

FieldTypeDescription
imagePostobject | nullPhoto post (title, cover, images[] with imageURL)

Users (searchType: "users")

FieldTypeDescription
uidstring | nullUser ID
uniqueIdstringUsername handle
nicknamestring | nullDisplay name
signaturestring | nullBio
followerCountinteger | nullFollower count
heartCountinteger | nullTotal likes on the profile
verifiedboolean | nullVerified flag
avatarstring | nullAvatar URL
secUidstring | nullStable account ID
profileUrlstring | nullCanonical profile URL

Output Example (videos)

{
"searchType": "videos",
"searchQuery": "the rock",
"id": "7635425590299970838",
"desc": "Mae Young > Marilyn Monroe The Rock is one lucky birthday boy! ...",
"createTime": 1777761063,
"url": "https://www.tiktok.com/@onthisdayinwwe/video/7635425590299970838",
"author": {
"id": "7050958181346116614",
"uniqueId": "onthisdayinwwe",
"nickname": "OnThisDayInWWE",
"signature": "Milestone moments in WWE history...",
"verified": false,
"avatarThumb": "https://...",
"secUid": "MS4wLjABAAAA..."
},
"stats": {
"diggCount": 377,
"shareCount": 30,
"commentCount": 3,
"playCount": 75000,
"collectCount": 54
},
"music": {
"id": "7635425604015229719",
"title": "original sound",
"authorName": "OnThisDayInWWE",
"playUrl": "https://..."
},
"video": {
"id": "7635425590299970838",
"duration": 111,
"cover": "https://...",
"playAddr": "https://...",
"downloadAddr": null,
"width": 576,
"height": 1024
}
}

Output Example (users)

{
"searchType": "users",
"searchQuery": "avengers",
"uid": "6589561205014249478",
"uniqueId": "raviprajapati0012",
"nickname": "Avengers official",
"signature": "Avengers lover",
"followerCount": 23700,
"heartCount": 746758,
"verified": false,
"avatar": "https://...",
"secUid": "MS4wLjABAAAA...",
"profileUrl": "https://www.tiktok.com/@raviprajapati0012"
}

Some media fields (for example video.downloadAddr) may be null when TikTok does not include them in the response. Play and cover URLs can expire; fetch them promptly if you need the files.

Handling of empty and blocked runs

Failed or empty outcomes are kept out of the dataset and reported in the REPORT record in the run's key-value store (when skips are recorded), alongside warnings or errors in the log.

  • No results for the query: the run fails after a session refresh attempt. Use a different query, loosen filters, or check proxies.
  • Blocked / empty upstream responses: automatically retried. If nothing could be scraped, the run fails with a clear message suggesting residential proxies.
  • Partial success: if some pages succeed and later pages stop, rows already saved stay in the dataset.

The run's status message reports how many results were scraped and how many issues were skipped.