tiktok-search

TikTok videos for a keyword search, one row per video: its text and hashtags, when it was posted, the author, plays, likes, comments, shares and saves, length, cover and sound. query is the search words; limit how many videos (default 20, at most 100). Our own search finds the videos on tiktok.com, in its order, and reads each one: about 2 to 5 s for 20; a video TikTok does not show in time keeps the search's text and has no counts. When it finds fewer than half of limit, a second source adds the rest (15 to 40 s; above 20 videos a slower one, 2 to 5 minutes: run it as a job).

stagedtiktok.comWASM module10 fields1 unit per page; records for the restfresh 30 min
‹ Recipes
…json
POST api.crawl4ai.com/recipes/…

$ crawl recipe

              
Live · your key · counts against your quota✓ 200 OK
# Hit Run - the rows render here as a table, with the cost

Fields

10 columns on every row. null means the site does not state it.
fieldtypemeaning
post_idstringTikTok's id of the video (digits, as a string).
urlstringThe video's page, https://www.tiktok.com/@<handle>/video/<id>.
descriptionstringThe video's text; the source sometimes leaves the hashtags out of it (they are in hashtags); null when it has none.
hashtagsstring[]The video's hashtags, without the #, in order, each once.
created_atstringWhen it was posted, ISO 8601 UTC (2026-09-23T17:02:20Z).
authorobject{username, name, followers}: username is the handle without @, name the display name, followers an integer.
statsobject{plays, likes, comments, shares, saves}, integers, as TikTok counts them (large counts are rounded by TikTok: 4500000).
duration_snumberThe video's length in seconds.
coverstringThe cover image URL; it is signed by TikTok and stops working after some hours.
musicobjectThe sound, {title, author, original}: original is true for a sound made for this video.

null means the site does not state it.

post_idstringTikTok's id of the video (digits, as a string).
urlstringThe video's page, https://www.tiktok.com/@<handle>/video/<id>.
descriptionstringThe video's text; the source sometimes leaves the hashtags out of it (they are in hashtags); null when it has none.
hashtagsstring[]The video's hashtags, without the #, in order, each once.
created_atstringWhen it was posted, ISO 8601 UTC (2026-09-23T17:02:20Z).
authorobject{username, name, followers}: username is the handle without @, name the display name, followers an integer.
statsobject{plays, likes, comments, shares, saves}, integers, as TikTok counts them (large counts are rounded by TikTok: 4500000).
duration_snumberThe video's length in seconds.
coverstringThe cover image URL; it is signed by TikTok and stops working after some hours.
musicobjectThe sound, {title, author, original}: original is true for a sound made for this video.

How it behaves

Cost. 1 unit per page; records for the rest. A failed run costs 0.

Freshness 30 min. The same input within 30 min is served from cache at 0 units.

How it answers. Answers at once for one input; a large run goes as a job you poll.

Questions about this recipeQuestions

Short answers. The API reference has the long ones.

Call POST /recipes/tiktok-search with your key and query and limit. You get rows with the 10 fields above. The recipe is tested against the live site every 6 hours.

Need more from TikTok?

Extra fields, higher volume, or a private copy with a freshness SLA. We build it on Enterprise.

Request a change

For developers

Get a free API key and run your first crawl.

1,000 credits every month. No credit card. Your self-hosted setup keeps working.

For teams

Talk to us about volume, regions and an SLA.

A 30-minute call with the team that writes the crawler. DPA on request, invoice billing, your choice of US, EU or Singapore.