SFOLN

Catalogue / Social media data

TikTok Search Scraper – Videos by Keyword

sfoln/tiktok-search · Social media, Videos, Automation On request

Search TikTok videos by keyword, sorted by relevance, likes or date: caption, author, plays, likes, comments, shares, saves, duration, music and hashtags, one JSON record per video. $0.40 per 1,000 videos + $0.003 per results page. Repeated videos are never charged.

About

What it does

TikTok Search Scraper – Videos by Keyword searches TikTok videos by keyword and returns one normalized record per video: video ID, URL, caption, posting date, duration, plays, likes, comments, shares, saves, cover image, music, hashtags, mentions and the author's handle, ID and nickname. Sort by relevance, most liked or newest, and filter by period. It's built for trend research, influencer discovery, brand and campaign monitoring, dataset building and AI agents.

Price

Price per delivered record

EventPricePer 1,000Charged for
TikTok search result
tiktok-search-result
$0.0004$0.40 / 1,000Charged once per TikTok video delivered as a dataset record. Query summary records are never charged.
TikTok search page
tiktok-search-query
$0.003$3 / 1,000Charged once per page of search results that delivered at least one new video. Covers the per-request upstream fee. Also charged for an empty page the upstream billed (when the budget covers it).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~tiktok-search/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["cooking hacks"],"maxVideosPerQuery":10}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/tiktok-search"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~tiktok-search/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Search TikTok for "cooking hacks" videos from this month and list the 20 most liked, with author, plays and hashtags.

Input

Input fields

Enter keywords. Each keyword produces one dataset record per video plus one summary record per keyword.

FieldTypeDefaultMeaning
keywords *arrayrequiredKeywords
Search terms, one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 keywords per run.
maxVideosPerQueryinteger30Max videos per keyword
How many videos to return per keyword (1–300). Each delivered video is one charged event, plus one page event per results page. Range 1–300.
sortBystring"relevance"Sort
Result order. One of "relevance", "most-liked", "date-posted".
datePostedstring"all-time"Period
Only videos posted within this period. One of "all-time", "yesterday", "this-week", "this-month", "last-3-months", "last-6-months".
regionstring—Proxy country
Optional 2-letter country code (US, GB, FR…). Routes the search through that country so country-restricted videos can appear; it does not filter results by country.
maxQueriesinteger100Max keywords
Safety cap on the number of keywords processed in this run. Range 1–1000.
concurrencyinteger4Concurrency
How many keywords are fetched in parallel (1–8). Range 1–8.
itemTimeoutSecsinteger600Time limit per input (seconds)
Pagination for one keyword stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. Range 60–3600.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified provider object to each result record.
Example input
{
  "keywords": [
    "cooking hacks"
  ],
  "maxVideosPerQuery": 10
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The keyword as provided.
recordTypestringRecord type
video (one per delivered video, charged) | query (one summary per keyword, never charged) e.g. "video"
positionintegerPosition
1-based position of the video within its input
querystring | nullKeyword
sortBystringSort
Summary records only.
datePostedstringPeriod
Summary records only.
regionstring | nullRegion
Video region (rows) or proxy region filter (summary).
videoIdstring | nullVideo ID
urlstring | nullVideo URL
descriptionstring | nullCaption
createdAtstring | nullCreated at
ISO 8601 UTC
durationSecsnumber | nullDuration (s)
playsnumber | nullPlays
likesnumber | nullLikes
commentsnumber | nullComments
sharesnumber | nullShares
savesnumber | nullSaves
coverUrlstring | nullCover URL
musicTitlestring | nullMusic title
musicAuthorstring | nullMusic author
hashtagsarrayHashtags
mentionsarrayMentions
isAdboolean | nullAd
authorHandlestring | nullAuthor handle
authorIdstring | nullAuthor ID
authorNicknamestring | nullAuthor nickname
rowsDeliveredintegerVideos delivered
Summary records only.
pagesFetchedintegerPages fetched
Summary records only.
pagesChargedintegerPages charged
Summary records only.
reachedEndbooleanReached end
Summary records only: the upstream reported no further pages.
stopReasonstringStop reason
Summary records only: limit | end | budget | max_pages | deadline | empty_pages | error
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
chargedEventstringCharged event
errorobjectError
warningsarrayWarnings
sourcestringSource
fetchedAtstringFetched at
Example record
{
  "input": "nursing",
  "recordType": "video",
  "position": 1,
  "query": "nursing",
  "videoId": "7268287584244124971",
  "url": "https://www.tiktok.com/@thatgreygentlemanitdxz/video/7268287584244124971",
  "description": "Tìm 'musclesandnursing'",
  "createdAt": "2023-08-17T13:48:40.000Z",
  "durationSecs": 23,
  "plays": 1282645,
  "likes": 481608,
  "comments": 187,
  "shares": 2721,
  "saves": 6978,
  "coverUrl": "https://p16-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/….jpeg",
  "musicTitle": null,
  "musicAuthor": null,
  "hashtags": [],
  "mentions": [],
  "isAd": false,
  "region": "US",
  "authorHandle": "thatgreygentlemanitdxz",
  "authorId": "7267964228375413803",
  "authorNickname": "thatgreygentlemanitdxz",
  "status": "ok",
  "charged": true,
  "chargedEvent": "tiktok-search-result",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents