Reference

TikTok Search API

One POST with platform tiktok resolves a keyword search into a page of TikTok videos: id, url, caption as the title, duration, creator handle, publish time and play count. Every row's url is accepted by the transcript and batch endpoints as-is, so a search plus a batch call transcribes a topic in two requests. No TikTok developer account or research API application is involved.

1 credit per page of resultsView pricing

Each page of results is one credit, however many videos it lists; pass next_cursor back as cursor for the next page. Failed requests are free.

On this platform

  • Set platform to tiktok; the YouTube-only filters (type, upload_date, duration, sort, captions) are not applied on TikTok.
  • A row's title is the video's caption, and channel is the creator's @handle.
  • One page costs 1 credit; pass next_cursor back as cursor for the next page.
POST/api/v2/transcripts/searchidempotent

Search for videos, channels or playlists

Resolve a keyword search into a paginated list of videos (metadata only). Searches YouTube by default; set platform to search TikTok or Instagram instead. Every video row carries a url the transcript endpoint accepts unchanged, plus duration and publish time where the source provides them. On YouTube, upload_date, duration and captions filter the videos and sort orders them, and type finds channels (data.kind channel_list) or playlists (data.kind playlist_list) instead, whose rows' urls the channel and playlist endpoints accept as-is.

Body parameters

querystringrequired
Keyword search query.
Example
platformstring (enum)optional
Where to search: youtube (default), tiktok, or instagram. Every video result's url is accepted by the transcript and batch endpoints as-is. The type, upload_date, duration, sort and captions options search YouTube only.
Example
type"video" | "channel" | "playlist"optional
YouTube only. What to search for: video (the default), channel or playlist. Channels come back as data.kind channel_list, each row's url accepted by the channel endpoint; playlists as data.kind playlist_list, each row's url accepted by the playlist endpoint. A channel row carries the @handle, subscriber count and description; its videoCount is null, because YouTube's channel results no longer show one.
Example
upload_date"hour" | "today" | "week" | "month" | "year"optional
YouTube video search only. Keep videos uploaded within the last hour, today, this week, this month or this year.
duration"short" | "medium" | "long"optional
YouTube video search only. Keep short (under 4 minutes), medium (4 to 20 minutes) or long (over 20 minutes) videos.
sort"relevance" | "views"optional
YouTube only. Result order: relevance (the default) or views (most viewed first). YouTube search no longer sorts by upload date or rating, so neither is offered; for recent videos, filter with upload_date.
Example
captionsbooleanoptional
YouTube video search only. true keeps only videos with subtitles or closed captions, whose transcripts come from captions rather than audio transcription. Defaults to false: no filter.
Example
limitinteger (1–50)optional
Max items to return per page: videos, or the playlists or channels some listing options return. Defaults to 5.
Example
cursorstringoptional
Opaque pagination cursor from a previous response's next_cursor (max 256 characters). Omit for the first page. Cursors are scoped to the listing that issued them, so send the same platform and listing options with each page. Offset-based sources cannot page past the first 2000 items.

Request example

curl https://transcriptfetch.com/api/v2/transcripts/search \
  -H "Authorization: Bearer $TRANSCRIPTFETCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"how transformers work","platform":"tiktok","limit":10}'

Responses

SuccessExample response envelope
{
  "ok": true,
  "request_id": "req_…",
  "data": {
    "kind": "video_list",
    "source": "search",
    "platform": "tiktok",
    "videos": [
      {
        "videoId": "7563520074795994399",
        "url": "https://www.tiktok.com/@explore.scientist/video/7563520074795994399",
        "title": "How does a power transformer work #knowledge #science #tiktok",
        "duration": 72,
        "channel": "@explore.scientist",
        "publishedAt": "2025-10-21T04:01:08Z",
        "stats": {
          "plays": 496600
        }
      },
      {
        "videoId": "7649719917507251488",
        "url": "https://www.tiktok.com/@theengineeringmindset/video/7649719917507251488",
        "title": "How transformers actually work: Two coils, a steel core, and a magnetic field that's pure magic (but science!). #ScienceExplained #HowItWorks #Transformer #STEM #Physics",
        "duration": 92,
        "channel": "@theengineeringmindset",
        "publishedAt": "2026-06-10T11:00:12Z",
        "stats": {
          "plays": 18300
        }
      }
    ],
    "next_cursor": "eyJvIjoxMH0"
  },
  "usage": {
    "credits_spent": 1,
    "balance": 656,
    "bytes": 0
  }
}

Every TikTok endpoint

Frequently asked questions

How do I search TikTok instead of YouTube?
Send platform tiktok in the body. Without it the search runs on YouTube. Everything else about the call is the same: query, limit and cursor.
Can I filter TikTok results by date, duration or captions?
No. Those filters are YouTube-only and are ignored on TikTok. The rows carry duration, publishedAt and stats.plays, so you can filter on your side after the fetch.
What is in a TikTok search row?
videoId, url, title (the caption), duration in seconds, channel (the creator's @handle), publishedAt and stats.plays. The url goes straight into the transcript or batch endpoint.
How do I transcribe everything a search returns?
Collect the url of each row and send them to the batch endpoint. Caption transcripts cost 1 credit each and videos without captions are transcribed from audio, billed on delivery.