Integration Guide

Searching What TikTok Creators Say, Not What They Type

TikTok's Research API exists, but it's closed to almost everyone who isn't an academic. Here's what's left for reading what's actually said in a video — not the caption — at scale.

Written by Alex P.

  • TikTok API
  • TikTok transcript
  • TikTok Research API
  • content analysis
  • spoken content search

If you’ve gone looking for a legitimate way to analyze TikTok content at scale, you’ve probably found TikTok’s Research API and then found out it isn’t for you. That’s not a rumor or a paywall story — it’s TikTok’s own eligibility policy, and it’s worth reading exactly rather than assumed, because the restriction is narrower and stranger than “commercial use costs money.”


Who the Research API is actually for

TikTok’s own eligibility page limits access to academic institutions in the US, EEA, UK, Canada, or Switzerland; not-for-profit research institutions in the EU; and, for a narrower carve-out, Brazilian academic institutions or non-profits specifically studying online youth safety. Every applicant has to show they are “independent of commercial interests” and conducting research “on a not-for-profit or non-commercial basis in pursuit of a public-interest mission.” A Ph.D. candidate applying needs an endorsement letter from a professor. There’s a defined research proposal requirement, an ethics-review requirement, and a funding-disclosure requirement.

Read that list as a filter rather than a formality: it isn’t “harder to get” for a commercial team, brand, agency, or indie developer — it’s explicitly the wrong door. The policy doesn’t have a slower, more expensive commercial tier sitting behind the academic one. There isn’t one. If your use case is a product, a client deliverable, or anything with a business behind it, TikTok’s own stated criteria disqualify you before you finish the application.

That leaves a real gap: no official route exists for reading TikTok content at scale if you’re not a credentialed non-profit researcher in an approved region. Whatever a commercial team does instead, it isn’t going to be “the Research API, just slower.”


Most tools that claim to “analyze TikTok content” are reading the caption — the text a creator typed into the post — and calling that content analysis. It isn’t, and the gap between the two is the actual opportunity here.

A caption is the author’s own written text. It’s often a call to action, a handful of hashtags, or nothing at all. A transcript is a machine transcription of the spoken audio in the video — what the person actually says, word for word, independent of whatever they chose to type. A creator can say a brand name out loud forty seconds into a video and never write it in the caption at all; a caption-only search misses that entirely, every time. If the thing you’re trying to find is “who’s talking about X,” the caption is the wrong field to search — you want the transcript.


The honest coverage number

TikTok doesn’t transcribe every video, and it’s worth stating the real figure rather than rounding it up: across 185 videos measured spanning 14 languages, 125 carried a transcript — 68%. A photo carousel is 0% by nature, since there’s no audio to transcribe. TikTok generates the rest for most, not all, spoken-audio videos, and there’s no way to force one into existing where TikTok didn’t produce it.

That’s the number as measured, not a marketing rounding of it — and it held up in a fresh spot-check for this piece: eight videos pulled from a live skincare-content search returned transcripts on six of them, and a fresh cooking-content search in French came back four-for-four, each carrying its original fr-FR track plus a second en-US track TikTok had already generated alongside it:

const { videos } = await (await fetch('https://api.fetchlayer.dev/tiktok/search-videos', {
  method: 'POST',
  headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ query: 'recette facile cuisine', limit: 8 }),
})).json();

for (const video of videos) {
  const { transcript } = await (await fetch('https://api.fetchlayer.dev/tiktok/video-transcript', {
    method: 'POST',
    headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ video: video.id }),
  })).json();

  if (transcript.available) {
    console.log(video.id, transcript.originalLanguage, transcript.tracks.map(t => t.language));
    // → 7574390703019642115 fr-FR [ 'fr-FR', 'en-US' ]
  }
}

That English track is worth pausing on: TikTok generates it as part of the same transcription pass, so a non-English video usually carries a free, already-timed English translation alongside its original — one call, one credit, two languages of searchable text. For a video with no transcript at all, the response is a normal 200 with available: false and an empty tracks array — a real answer, not an error, and not worth retrying.


What becomes searchable that wasn’t before

Once transcripts are in hand, the thing you can build is a search index over what’s actually said — not what’s typed — across as many videos as you can pull:

async function findSpokenMentions(searchQuery, keyword) {
  const { videos } = await (await fetch('https://api.fetchlayer.dev/tiktok/search-videos', {
    method: 'POST',
    headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ query: searchQuery, limit: 30 }),
  })).json();

  const hits = [];
  for (const video of videos) {
    const { transcript } = await (await fetch('https://api.fetchlayer.dev/tiktok/video-transcript', {
      method: 'POST',
      headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
      body: JSON.stringify({ video: video.id }),
    })).json();

    if (!transcript.available) continue;

    const track = transcript.tracks.find(t => t.isOriginalLanguage) ?? transcript.tracks[0];
    if (track.text.toLowerCase().includes(keyword.toLowerCase())) {
      const segment = track.segments.find(s => s.text.toLowerCase().includes(keyword.toLowerCase()));
      hits.push({ video: video.url, saidAt: segment?.start, said: segment?.text });
    }
  }
  return hits;
}

That’s a search over spoken product mentions, spoken claims, spoken competitor names — a category of query no caption search, and no commercial route into TikTok’s own platform, currently answers. It’s also the one thing the Research API’s own applicants can do that nobody else can, minus the eligibility wall: the API structure exists, it’s just fenced off to a narrow set of institutions by policy rather than by technology.


Where this leaves “TikTok API”

If what you need is the general capability list — profiles, an account’s videos, hashtag feeds, comments — that’s the TikTok API page. This piece is for the narrower question underneath “I want to analyze TikTok content and the Research API rejected me”: once you accept that transcripts, not captions, are the field that answers it, and that coverage is 68% rather than 100%, here’s what that actually lets you build.


Practical notes

  • 68% is measured, not guaranteed per video. Any individual video can land on either side of that line — check transcript.available before assuming a track exists, and treat a false result as a normal answer, not a failed request.
  • A caption still matters for context, not content. Hashtags and mentions on a video are read from TikTok’s own annotations rather than parsed out of caption text, so they stay reliable even on a video with no transcript at all — they’re just a different signal from what was said out loud.
  • Segments carry timestamps. segments[].start and .end are in seconds, so a keyword hit points at the exact moment in the video, not just “somewhere in this transcript.”

Next Steps