Operated by Sourcelane✓ verified
Extract the text shown on screen in TikTok videos and slideshows: hooks, recipe steps, lists and tips, with timestamps, kept apart from spoken subtitles.
A tool that extracts on-screen text from TikTok videos and photo slideshows for indexing and content extraction. It samples video frames, detects and reads overlay text, isolates burned‑in subtitles (separating text that mirrors spoken audio), and returns structured per-post results including the opening hook line, a de-duplicated sequence of overlay text in display order, subtitle-only text kept separate, time- or slide-indexed text segments, basic post metadata (URL, creator, caption, upload date, duration, views, likes), counts of analyzed frames and seconds, and optional links to the frames that were read.
Verified Oct 25, 10:11 PM
$0.04
per post
Up to 25 per call. Only pay for results returned; failed calls are refunded.
Recipe and how-to extraction
Pull ingredient lists, amounts and step instructions shown as on-screen text
Hook research
Collect opening text lines used at the start of videos to evaluate hooks
Content repurposing
Convert listicle and “X tips” videos into articles, newsletters, or carousel posts
Competitor analysis
Surface on-screen offers, calls to action and promotional messages used by rivals
Searchable video archives
Index and tag videos by on-screen text for search, classification or metadata enrichment
TikTok video URLs, photo slideshow URLs, short links or video IDs, one per line.
Usernames or profile URLs.
Optional settings
| Window | Uptime | Success rate | p50 | p95 | Calls |
|---|---|---|---|---|---|
| 24h | — | — | — | — | 0 |
| 7d | — | — | — | — | 0 |
| 30d | — | — | — | — | 0 |
Call it through Sourcelane's gateway or MCP server. We run the connector, apply your agent's spend guardrails, and bill only the results returned.
Call it via Sourcelane
curl -X POST https://api.usesourcelane.com/v1/call \
-H "Authorization: Bearer sl_live_your_agent_key" \
-H "Content-Type: application/json" \
-d '{"listing":"tiktok-on-screen-text-extractor","params":{"videoUrls":["https://www.tiktok.com/@foodclub.by.irna/video/7678449607751273760"]},"maxResults":10}'Request params
| Field | Type | Required | Description |
|---|---|---|---|
videoUrls | array | optional | TikTok video URLs, photo slideshow URLs, short links (vm.tiktok.com) or video IDs, one per line (up to 500 per run). |
profiles | array | optional | Usernames (with or without @) or profile URLs. The latest posts of each profile are read. |
maxVideosPerProfile | integer | optional | How many of the most recent posts to read for each profile (1-200). |
frameIntervalSeconds | number | optional | How often a frame is taken from the video (0.5-10 seconds). 1 second catches almost every text change. Long videos are spread out automatically so the whole video fits the frame limit. |
maxFramesPerVideo | integer | optional | Upper limit of distinct frames read per video (1-30), and of photos read per slideshow. Repeated frames with the same picture are skipped before this limit is applied, and long videos are spread evenly across it. |
includeFrameImages | boolean | optional | Save every frame that was read as a JPEG in the run's key-value store and add their links to each result, so you can check the text against the picture. |
Each result contains
| Field | Type | Description |
|---|---|---|
inputUrl | string | — |
profile | null | — |
status | string | Status |
message | null | — |
postType | string | — |
videoId | string | — |
url | string | Post |
author | string | Creator |
authorName | string | — |
description | string | — |
createdAt | string | — |
durationSeconds | integer | Seconds |
views | integer | — |
likes | integer | — |
hookText | string | Hook |
fullText | string | On-screen text |
captionText | null | Spoken subtitles |
textSegments | array | — |
framesAnalyzed | integer | Frames |
analyzedSeconds | integer | — |
frameImages | null | — |
scrapedAt | string | — |
Pick your tool and connect in under a minute. Then just ask — for example: “What are the top 25 TikTok videos for 'protein coffee' this week, and what hooks do they use?”
Connect Claude
Web, desktop and mobile. One click, then confirm.
Adds the Sourcelane MCP server with your key as a header.
claude mcp add --transport http sourcelane https://api.usesourcelane.com/mcp \
--header "Authorization: Bearer sl_live_your_agent_key"Alternative to the connector URL: add to claude_desktop_config.json, then restart Claude.
{
"mcpServers": {
"sourcelane": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.usesourcelane.com/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer sl_live_your_agent_key"
}
}
}
}Add to ~/.cursor/mcp.json (or Windsurf's mcp_config.json).
{
"mcpServers": {
"sourcelane": {
"url": "https://api.usesourcelane.com/mcp",
"headers": {
"Authorization": "Bearer sl_live_your_agent_key"
}
}
}
}Save as .vscode/mcp.json. VS Code prompts for your key once.
{
"servers": {
"sourcelane": {
"type": "http",
"url": "https://api.usesourcelane.com/mcp",
"headers": {
"Authorization": "Bearer ${input:sourcelane-key}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "sourcelane-key",
"description": "Sourcelane agent key",
"password": true
}
]
}Create a GPT → Actions → Import from URL, then Authentication: API Key, Bearer.
https://usesourcelane.com/openapi.jsonOne POST. Pass maxResults to cap cost.
curl -X POST https://api.usesourcelane.com/v1/call \
-H "Authorization: Bearer sl_live_your_agent_key" \
-H "Content-Type: application/json" \
-d '{"listing":"tiktok-on-screen-text-extractor","params":{"videoUrls":["https://www.tiktok.com/@foodclub.by.irna/video/7678449607751273760"]},"maxResults":10}'Wrap the REST call as a tool, or point an MCP client at the endpoint.
import requests
res = requests.post(
"https://api.usesourcelane.com/v1/call",
headers={"Authorization": "Bearer sl_live_your_agent_key"},
json={
"listing": "tiktok-on-screen-text-extractor",
"params": {"videoUrls":["https://www.tiktok.com/@foodclub.by.irna/video/7678449607751273760"]},
"maxResults": 10,
},
timeout=300,
)
body = res.json()
print(body["receipt"]["chargedMicros"], "micro-USD for", body["receipt"]["results"], "results")
print(body["data"])—
0 reviews
Leave a review
Loading reviews…