Instagram & TikTok Toolkit
Pricing
$20.00 / 1,000 started minute of video delivereds
Instagram & TikTok Toolkit
Get TikTok and Instagram Reels transcripts with timestamps plus 3 frames per video, from public video URLs or a scraper's dataset: up to 100 videos per run, ready for AI agents, pay per started minute.
Pricing
$20.00 / 1,000 started minute of video delivereds
Rating
0.0
(0)
Developer
Frameskim Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Give your agent the words and the frames of an Instagram Reel or a TikTok. This actor turns public Instagram and TikTok video URLs, or the dataset of a scraper you already ran, into transcripts with timestamps plus 3 frames per video, ready to paste into an LLM and one call away from Claude and other agents through the Apify MCP server.
Use it to:
- Analyze competitors' Reels: what they say, how they open, how long they run.
- Pull scripts and hooks out of TikToks.
- Transcribe the videos a TikTok or Instagram scraper already returned.
- Save the images of Instagram posts before their links expire.
- Feed an LLM the words and the frames of a short video.
TikTok transcript with timestamps and frames
Send up to 100 single video URLs per run, or pick the dataset of a scraper run. For each video you get one dataset item:
url,platform(tiktokorinstagram),videoIdanddurationSecs.lang: the language detected in the audio, or the language of the video's own captions when it has them.segments: the transcript as{ start, end, text }in seconds, andtext: the whole transcript as one string.frames: 3 images at 10%, 50% and 90% of the video, each{ t, url }, stored in your run's key-value store.frameskimUrl: a link to Frameskim, the sister actor for frames by time range and the moments of YouTube videos.
The same item shape works for TikTok links and Instagram Reel links, and a run can mix both.
Instagram Reels transcript
Paste public Reel URLs in urls, or pass the dataset of apify/instagram-reel-scraper to transcribe the Reels it found. Each Reel comes back with its transcript, segments and 3 frames.
A video without speech is delivered with its frames, empty segments and text, noSpeech: true and the message "No speech found. Nothing was charged for this video." A video that fails becomes an item with url and error and is not charged.
Instagram post images from a scraper's dataset
Pass the dataset of a run of apify/instagram-scraper or apify/instagram-post-scraper in datasetId (or paste its items in datasetItems) and each image or carousel post becomes one dataset item:
url(the post's permalink),platform,kind: "post",postId,type(imageorcarousel),caption,timestampandlocation({ name, id }, ornullwhen the scraper does not give it).images: each image as{ index, url, width, height }, downloaded in the run and stored in your run's key-value store. Theurlis the stored record, never the Instagram CDN link, which expires soon after the scrape: pass the dataset right after the scraper finishes. A carousel gives up to 20 images in order.- With
readFlyersset tofirst(the first image of each post) orall(every image), each image read also carriesflyer:{ isEvent, title, dates: [{ text, start }], venue, artists, rawText }. The model returnsnullor an empty list for what is not in the image;isEvent: falsemeans the image is not an event flyer.readFlyersisnoneby default. imagesMissingandimagesMissingReasonwhen some images could not be saved, andflyerErroron an image that could not be read.
The post's owner, tagged accounts, mentions, comments, likes and Instagram's alt text are never in the output. Profiles, hashtags, stories and searches are not read: run the scraper on them and pass its dataset.
When readFlyers is on, each image read is sent to a vision model (Google Gemini 2.5 Flash Lite) through OpenRouter, with data collection denied, to read the event. Nothing else leaves the run.
Input from a scraper's dataset
Instead of urls, or together with them, choose in datasetId the dataset of a run of clockworks/tiktok-scraper, apify/instagram-reel-scraper or apify/instagram-scraper, or paste their items in datasetItems. The actor reads that dataset only with the read permission you give it in the input field, takes each video's public URL (never the expiring CDN link) and its duration, and copies only the URL and the ID into its output. Image and carousel posts are delivered as posts (next section); items that are neither (a scraper's error rows, profiles) become items with source and "Not a video item. Nothing was charged for it." The limit of 100 counts the videos and posts left after that.
Pricing
Pay per event, no subscription. Apify bills each event and never more than the spending limit you set for the run.
| Event | Price (USD) | When |
|---|---|---|
minute | $0.02 | Per started minute of each delivered video: 30 s is 1, 61 s is 2, 10 minutes is 10 |
post | $0.002 | Per Instagram image or carousel post delivered |
image | $0.001 | Per post image saved in your run's storage (a carousel of 20 is 20) |
flyer | $0.005 | Per post image read when readFlyers is on, even when the image turns out not to be an event |
A post of one image costs $0.003 ($0.008 with its flyer read); a carousel of 10 images with the first one read costs $0.017.
What is not delivered is not charged: a video without speech, a private, removed or blocked video, a video that takes too long or needs more processing than its price covers, a post whose images could not be downloaded, an image that could not be read, and every video or post left after a stop (see Limits). If every item fails, the run ends with the reason and "Nothing was charged."
Examples
Input:
{ "urls": ["https://www.tiktok.com/@bbcnews/video/7694767678363340054", "https://www.instagram.com/reel/DWjcPlnjQIx/"] }
Output (one item per video, values shortened):
{ "url": "https://www.tiktok.com/@bbcnews/video/7694767678363340054", "platform": "tiktok", "videoId": "7694767678363340054", "durationSecs": 26.7, "lang": "en", "segments": [{ "start": 0.0, "end": 4.2, "text": "..." }], "text": "...", "frames": [{ "t": 2.67, "url": "https://api.apify.com/v2/key-value-stores/.../records/tiktok-7694767678363340054-0.jpg" }], "frameskimUrl": "https://apify.com/emttn/frameskim" }
A post with one flyer read (readFlyers: "first", values shortened):
{ "url": "https://www.instagram.com/p/DZxvMgyH8yR/", "platform": "instagram", "kind": "post", "postId": "DZxvMgyH8yR", "type": "image", "caption": "Live at the club, Friday 24 October", "timestamp": "2026-06-20T10:00:04.000Z", "location": { "name": "Example Venue", "id": "1234567890" }, "images": [{ "index": 1, "url": "https://api.apify.com/v2/key-value-stores/.../records/post-DZxvMgyH8yR-1", "width": 1080, "height": 718, "flyer": { "isEvent": true, "title": "Live at the club", "dates": [{ "text": "Friday 24 October, 21 h", "start": "2026-10-24T21:00:00" }], "venue": "Example Venue", "artists": ["Example Band"], "rawText": "..." } }] }
A video that failed:
{ "url": "https://www.tiktok.com/@someone/video/7000000000000000000", "error": "This video was removed or does not exist. Nothing was charged." }
Use it by API
curl -X POST "https://api.apify.com/v2/acts/emttn~instagram-tiktok-transcript/runs" \-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \-d '{"urls": ["https://www.tiktok.com/@bbcnews/video/7694767678363340054"]}'
Then read the run's dataset items when it finishes.
Use it from Claude (MCP)
Add the Apify MCP server with this actor as a tool:
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com/?actors=emttn/instagram-tiktok-transcript" } } }
Then ask, for example: "Use Instagram & TikTok Toolkit on this Reel, list the spoken steps and check the frames for the ingredients."
Integrations
- Run it after your scraper. In the Integrations tab of clockworks/tiktok-scraper or apify/instagram-scraper, add this actor with an Actor-to-Actor integration: it starts when the scraper finishes and reads its dataset: Actor-to-Actor integrations.
- Schedule it. Put the scraper on a schedule and the chain runs again each time, so an account is transcribed every day or every week as it posts: how to schedule tasks.
- Make, Zapier, n8n and webhooks work through Apify's own integrations, and Claude through the MCP server above.
Ready-made tasks (TikTok transcript, Instagram Reels transcript, save Instagram post images) are in the Tasks tab of this page.
Related actors
- TikTok Scraper: finds the videos of a profile, hashtag or search to pass here.
- Instagram Scraper: finds posts and Reels of a profile or hashtag.
- Instagram Reel Scraper: lists the Reels of an account.
- YouTube Transcript: the same for YouTube, up to 100 videos per run.
- Frameskim: frames and moments of YouTube videos.
Limits
- Videos: single public videos only: no profiles, hashtags, searches, stories or private accounts. More than 100 videos, or any URL that is not a single video, is refused before anything is processed: "Accepts single video URLs only, up to 100 per run. Nothing was charged."
- Videos are processed one after the other. Each video may take 120 s plus 45 s per started minute of its duration; one that takes longer is stopped and not charged. The batch stops after 55 minutes.
- Each video may cost us at most 60% of what it is charged; one that needs more is stopped with "Stopped: this video needs more processing than its price covers. Nothing was charged for it."
- The batch stops after 5 failures in a row, or when what the failed and no-speech videos cost us exceeds 30% of what was charged plus 0.02 USD. The videos left become
erroritems ("Stopped: ..."), nothing is charged for them, and the run still ends as succeeded with what was delivered. - Before each video the actor checks that your spending limit covers all of its minutes; when it does not, the batch stops and the rest are
erroritems, not charged. - Duplicate URLs (the same video twice, in any URL form) are processed and charged once.
- Posts come only from a scraper's dataset, never from a profile, hashtag, story, search or a loose
/p/URL: those end without processing anything with "Profiles, hashtags and stories are not accepted. Run apify/instagram-scraper or apify/instagram-post-scraper on the profile and pass its dataset indatasetId. Nothing was charged." A/p/URL that is not a video says "This post has no video. To get image posts, pass the dataset of apify/instagram-scraper indatasetId. Nothing was charged for it." - A post has up to 20 images of at most 8 MB each. A post whose images cannot all be downloaded is delivered with
imagesMissingif at least one was saved; with none saved it becomes an item witherror"Could not download this post's images: their links expire soon after scraping. Run the scraper again and pass its dataset right away. Nothing was charged for this post." - Each post may cost us at most 30% of what it is charged, with the same stop rules as videos; before each post the actor checks that your spending limit covers it in full (one
post, itsimageevents and theflyerreads you asked for) and otherwise stops with "Stopped: your maximum charge for this run was reached. Nothing was charged for this post." - Instagram image links usually expire within hours of the scrape. If the scraper's dataset is old, run it again.
FAQ
Which languages? The language is detected from the audio and returned in lang. Tested on English so far.
What if a run fails? The status message says why. A run that cannot start says "Nothing was charged."; a run that stops unexpectedly says "Only delivered videos were charged." Retry later if the platform blocked the request.
Do you keep my videos or transcripts? No. Each video file is deleted as soon as its item is done and is never delivered. Frames and transcripts live only in your run's own Apify storage, with your plan's retention.
Do you keep post images? No. Images are saved only in your run's default key-value store, with your plan's retention. With readFlyers on, each image read goes to a vision model through OpenRouter with data collection denied; nothing is kept by us.
Can it read a flyer into a calendar event? It returns the title, dates (as written and as ISO 8601 when the year can be inferred from the post's date), venue, artists and the raw text. It returns null for what is not in the image, so check isEvent and the dates before you publish them.
Is there an official Instagram or TikTok transcript API? Partly, and with conditions. Meta's IG Media reference has no transcript field, and it only returns media owned by Instagram professional accounts. TikTok's Research API video query exposes voice_to_text, but it is the Research API, for qualified researchers, and needs a client access token with the research.data.basic scope. This actor takes public video URLs or a scraper's dataset and transcribes the audio.
TikTok and Instagram transcript alternatives? You can open each video and type what it says, or run a scraper and a speech-to-text tool of your own and join the two. This actor does both in one run and bills per started minute; the scrapers it works with are in Related actors.
YouTube? Use YouTube Transcript for AI Agents for transcripts and Frameskim for frames and moments.
Legal
Not affiliated with TikTok, Instagram or Meta. By running this actor you confirm you have the right to process each video and each post you submit.
Takedown requests: open an issue in the Issues tab of this page or write to support@frameskim.dev. Blocked videos, posts and accounts are refused on the next run with "This video is not available in this actor. Nothing was charged." (for a post, "This post is not available in this actor. Nothing was charged.")