Source

Query TikTok videos and transcripts with SQL

TikTok public-catalogue videos — about 7.1 billion videos from 38.8 million creators (measured 2026-08-27) with descriptions, hashtags, engagement counts, and 1.26 billion caption-transcript rows — queryable with read-only SQL by creator and video.

Surface

  • Recordsvideos
  • Canonicaltiktok.videos
  • Freshness
  • Cadencearchive of public catalogue pages; engagement counts are snapshots from when each video row last landed
  • MethodPublic TikTok video pages and auto-caption tracks; source-native video and transcript records.
  • StatsLast stats snapshot: 2026-08-27T22:31:10Z

Query surfaces

  • tiktok.videos
  • tiktok.transcripts

Public TikTok video pages and auto-caption tracks; source-native video and transcript records.

Best for

a creator’s full public catalogue by handle — the indexed access path
spoken content: caption transcripts per (video, language), creator captions and TikTok ASR distinguished
hashtag, music, and duration facets on every video row

Fields

  • id
  • handle
  • provenance_handle
  • author_id
  • author_name
  • author_verified
  • create_time
  • description
  • hashtags
  • music
  • duration
  • play_count
  • like_count
  • comment_count
  • share_count
  • collect_count
  • transcript
  • transcript_source
  • url
  • fetched_at
  • source
  • crawler_version
  • source_file
  • loaded_at

Read live from the schema registry for tiktok.videos — 24 columns. Every relation's full contract is served by /v1/scry/schema.

Indexed predicates

  • Pruneshandle = '<handle>'

Queries

A creator’s newest videos

Handle is the indexed key; collapse pre-merge duplicates on id.

SELECT id, create_time, description, play_count, like_count, url
FROM (
  SELECT * FROM tiktok.videos
  WHERE handle = 'khaby.lame'
  ORDER BY loaded_at DESC
  LIMIT 1 BY id
)
ORDER BY create_time DESC
LIMIT 20;

What a creator says on camera

Transcripts by handle, one row per video and language, with the caption source.

SELECT video_id, lang, source, is_autogen, char_len, substring(text, 1, 160) AS excerpt
FROM (
  SELECT * FROM tiktok.transcripts
  WHERE handle = 'khaby.lame'
  ORDER BY loaded_at DESC
  LIMIT 1 BY video_id, lang
)
ORDER BY create_time DESC
LIMIT 20;

Gaps

  • HolesNone declared on the live schema entry for tiktok.videos (declared holes are curation, not a measurement of completeness).
  • Notethe table orders by (handle, id): a handle predicate prunes; description or transcript text predicates scan the whole relation
  • NoteReplacingMergeTree — collapse on id (videos) or (video_id, lang) (transcripts) inside a subquery before counting; count videos with uniq(id)
  • Noteengagement counts are not continuously refreshed — do not rank recent windows by engagement drift