TikTok Stories Scraper: Active Stories & Video Links, No Login
Pricing
from $3.80 / 1,000 story returneds
TikTok Stories Scraper: Active Stories & Video Links, No Login
Get the stories any public TikTok account has up right now: video and photo links, best-quality MP4, post and expiry time, views, likes, sound and caption. Optionally save the files to Apify so they outlive the 24 hours, or return only stories you have not seen yet. No login. Many accounts per run.
Pricing
from $3.80 / 1,000 story returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Get the stories a public TikTok account has up right now: this Actor returns every active story as one row with its video or photo links, best-quality MP4, post time, expiry time, views, likes, sound and caption, with no login and no cookies. Turn on saveMedia and the videos and photos are saved to Apify, so you keep them after the story disappears.
On 2026-10-21 (UTC) the example input (five accounts, 13 active stories) came back in about 10 seconds.
- Every active story, in TikTok's play order or newest first.
storyPositionsays where the story sits in the account's queue,activeStoriesCounthow many are up. - When it disappears.
expiresAtandhoursLefton every row, next tocreatedAt. - The best-quality MP4.
bestQualityVideoUrlis the highest-resolution file TikTok offers (often 1080p), with its size, resolution and codec. Photo stories list every image inimageUrls. - Files you can keep. With
saveMedia, each video or set of photos is copied into the run's storage and linked insavedMediaUrls. Those links open without any header and do not expire with the story. - Only new stories on a schedule. With
onlyNewStories, a scheduled run returns only the stories it has not returned before, so each story is paid for once. - No row without a reason. An account with no story up, a private account, an unknown username or a verification page comes back as a free row that says so.
- Up to 200 accounts per run, as usernames, profile URLs or numeric user IDs.
Unofficial and not affiliated with TikTok. It reads only what TikTok shows to any visitor without logging in: no private accounts, no direct messages, nothing behind a login.
What people use it for
- Archiving stories before they vanish: a story is gone after 24 hours. Schedule the Actor with
onlyNewStoriesandsaveMediato keep a copy of every story an account posts. - Brand and competitor monitoring: see what a brand, a creator you work with or a competitor puts in their stories, and how many views each one gets.
- Influencer campaign proof: keep the story a creator posted for a campaign, with its post time and view count.
- Content research: which sounds and formats accounts use in stories, as one clean JSON row per story.
How to get the active stories of a TikTok account
- Put the accounts in
profiles:jamescharles,@jamescharles, the profile URL or a numeric user ID, one per line. - Optionally turn on
saveMediato keep the videos and photos, oronlyNewStoriesfor scheduled runs. - Click Start.
- Download the dataset as CSV, Excel or JSON, or call the Actor from the Apify API, Python or Node.js and read the rows as JSON.
Input
| Field | Default | What it does |
|---|---|---|
profiles | none | Usernames, profile URLs or numeric user IDs, one per line (commas and spaces also separate entries). Up to 200 per run. |
maxStoriesPerProfile | 100 | At most this many stories per account (up to 500). A free row says how many were left out. |
order | oldest-first | oldest-first is TikTok's play order; newest-first puts the latest story first. |
onlyNewStories | false | Return only stories that an earlier run with the same monitorName did not return. |
monitorName | default | Separate memories for separate schedules. Letters, digits and hyphens. |
saveMedia | false | Save each story's best-quality MP4 or all its photos to the run's storage and link them in savedMediaUrls. |
useProxy | true | Retry through a US proxy only if TikTok answers with a rate limit or an empty response. Off = no proxy is used or paid for. |
{"profiles": ["jamescharles", "https://www.tiktok.com/@complex"],"onlyNewStories": true,"monitorName": "brands","saveMedia": true}
If you leave profiles out, the example in the input form is read and the run log says so. An empty list is rejected with a free invalid-input row.
Output
One row per active story. A video story looks like this (links shortened):
{"status": "ok","inputProfile": "jamescharles","username": "jamescharles","usernameMatchesInput": true,"nickname": "James Charles","verified": true,"followerCount": 39156907,"storyId": "7698947200063212814","storyUrl": "https://www.tiktok.com/@jamescharles/video/7698947200063212814","storyType": "video","storyPosition": 3,"activeStoriesCount": 5,"createdAt": "2026-10-21T02:47:23.000Z","expiresAt": "2026-10-22T02:47:23.000Z","hoursLeft": 11.2,"caption": null,"videoUrl": "https://v16-webapp-prime.us.tiktok.com/video/...","bestQualityVideoUrl": "https://v16-webapp-prime.us.tiktok.com/video/...","bestQualityWidth": 1080,"bestQualityHeight": 1920,"bestQualityCodec": "h265_hvc1","bestQualityBytes": 1032838,"durationSeconds": 10,"videoWidth": 720,"videoHeight": 1280,"imageUrls": [],"playCount": 62900,"likeCount": 961,"commentCount": 0,"shareCount": 15,"saveCount": 0,"musicTitle": "original sound","isAd": false,"mediaSaved": null,"savedMediaUrls": []}
Every row also has source, scrapedAt, userId, secUid, createTime, videoDownloadUrl, imageCount, coverUrl, countsMayBeRounded, musicId, musicAuthor, musicIsOriginal, musicUrl, hashtags, mentions and mediaNote. Notes on the columns:
- TikTok's video links (
videoUrl,videoDownloadUrl,bestQualityVideoUrl,musicUrl) open only with the headerReferer: https://www.tiktok.com/and expire within hours. Image links open without a header. UsesaveMediafor links that open anywhere and last. storyPosition1 is the oldest active story, the first one TikTok plays. Withorder: "newest-first"the rows come newest first and keep their position numbers.bestQualityCodecish264(plays everywhere) orh265_hvc1(HEVC: smaller files, but some older players and Windows without the HEVC extension do not open it). TikTok often offers 1080p only as HEVC.storyTypeisphotofor photo stories: they haveimageUrlsandimageCount, and no duration or video links.hoursLeftis counted from the moment of the run.mediaSavedisnullwhensaveMediais off,truewhen every file of the story was saved, andfalsewith the reason inmediaNotewhen a file could not be saved.- Counts are plain integers exactly as TikTok publishes them. TikTok rounds views, likes, comments and shares of 10,000 and more;
countsMayBeRoundedistrueon those rows. - Story captions are often empty;
captionis thennull.
FAQ
How can I see someone's TikTok stories without an account?
Put their username or profile URL in profiles and click Start. Each story they have up right now comes back as one row with its video or photo links, post time, expiry time and view count. No login and no cookies are needed.
How do I download TikTok stories as MP4?
Turn on saveMedia. Each story's best-quality MP4 (or every photo of a photo story) is saved to the run's storage, and savedMediaUrls links to the files. Without it, bestQualityVideoUrl is TikTok's own link, which needs the header Referer: https://www.tiktok.com/.
Can I save TikTok stories before they disappear?
Yes. Schedule the Actor every few hours with onlyNewStories and saveMedia on. Each run returns and saves only the stories it has not returned before, so you keep a copy of each story and pay for it once.
Does the account know I viewed its story? The Actor reads stories the way a visitor who is not logged in does, so no TikTok account of yours is involved.
Why did an account return no stories?
Stories disappear 24 hours after they are posted, and many accounts have none up most of the time. A free no-active-stories row says so; private and unknown accounts get their own free rows, so you never pay for stories that are not there.
How much does it cost? $9.00 per 1,000 stories on the Apify Free plan, down to $3.80 per 1,000 on paid plans. Stories with saved media cost $20.00 per 1,000, down to $10.00 on paid plans. Rows that explain a missing or empty result are free.
Rows that are never charged
| Status | Meaning |
|---|---|
no-active-stories | TikTok listed no active story for the account at the time of the run. |
no-new-stories | With onlyNewStories: every active story was already returned by an earlier run with the same monitorName. |
no-such-profile | TikTok returned no profile for the username (code 10221). |
private-account | The account is private, so its stories were not requested. |
list-refused | TikTok refused the account's story list (code 10201). |
max-stories-reached | The account had more active stories than maxStoriesPerProfile. |
stopped-reading | Reading stopped part way (a later page could not be read). The rows returned before that are complete. |
verification-page | TikTok showed a verification page (a check that the visitor is a person). The Actor does not try to get past it; the run stops there. |
blocked | TikTok refused or kept answering with a rate limit or an empty response. |
unreadable | The page could not be read (tiktokStatusCode has TikTok's code when it gave one). |
invalid-input / duplicate | The entry could not be read, or it is the same account as an earlier entry. |
budget-reached / not-checked | The run's maximum total charge had no room for more, or the list was longer than one run takes. |
Pricing
- $9.00 per 1,000 stories returned on the Apify Free plan, down to $3.80 per 1,000 on paid plans, charged only for rows with
status: "ok". - $20.00 per 1,000 stories with saved media (
saveMediaon and every file saved), down to $10.00 per 1,000 on paid plans. A story whose file could not be saved is charged as a plain story. - The Actor returns only as many stories as the run's maximum total charge can pay for, and a free row says what was left out.
- If Apify restarts a run, the stories already in the dataset are not returned or charged again.
Good to know
- Unofficial. Public data only. This Actor is not affiliated with TikTok.
- The rows are the stories TikTok shows to a visitor who is not logged in. It can differ from what you see in the app while logged in.
- For a numeric user ID, TikTok gives the same empty answer for an account with no story and for an ID that does not exist; the free row says so.
- Saved files stay in the run's storage for as long as Apify keeps the run's data (see your plan's data retention). Download them if you need them longer.
- The Actor does not read comments, viewers of a story or follow short links (
vm.tiktok.com); open a short link in a browser and paste the profile URL. - If TikTok shows a verification page, the run stops there and the rows returned before it are complete.
Thanks for using this Actor
We build these tools for people who run them every day, and we improve them from what users tell us.
- Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
- Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.
If this Actor saved you time, a short review helps other people find it.