TikTok Story Viewer
Pricing
from $2.05 / 1,000 stories
TikTok Story Viewer
View and export active public TikTok stories from usernames, @handles, or public profile URLs. Get story IDs, timestamps, media links, covers, engagement, music, and author data when TikTok exposes them.
Pricing
from $2.05 / 1,000 stories
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
0
Bookmarked
46
Total users
9
Monthly active users
9 days ago
Last modified
Categories
Features
Share
🎬 TikTok Story Viewer for active public stories
Brand teams, creators, and researchers can use this TikTok story viewer to check active public stories from TikTok usernames, @handles, or profile URLs. Each saved row gives the story ID, creation time, sticker text, region, direct media links, covers, engagement counts, music data, and author details, so you can review current stories with less manual work.
Use it as a TikTok story viewer without a TikTok login when you need public profile story data for monitoring, creator research, social reporting, content review, or archiving links. It does not discover profiles, search TikTok, scrape regular videos, or save media files in Apify storage.
- Review active public stories from a known profile without signing in with a TikTok anonymous viewer story check.
- Export active stories for a submitted profile with a TikTok viewer story run.
- Check current public stories from several profiles with a TikTok story viewer anonymous run.
- Gather story links and metadata for creator research with a TikTok viewer anonymous run.
- Save the photo slides and cover images of a creator's stories with a TikTok viewer story anonymous run.
📦 Active TikTok story data
Each saved row represents one active public TikTok story. Its storyType is video or photo. Video stories can include a direct video URL without a watermark and a separate watermarked URL. If TikTok does not provide a distinct watermarked link, watermarkedVideoUrl is null. Photo-style stories use the same row shape, list their images in media.photoSlides, and can have null video links while cover data remains available. Rows also list sticker text, the region TikTok lists, video width and height, and the author's verified badge and follower count when TikTok provides them.
🚀 Check public TikTok stories
- Add one or more profiles in TikTok profiles.
- Enter usernames such as
hbomax, @handles such as@tiktok, or public profile URLs such ashttps://www.tiktok.com/@tiktok. - Leave Story limit per profile empty or enter
0to get all active stories, or set a positive number for a per-profile cap. - Choose Story order as
newest,oldest, orprofileOrder. - Start the Actor and open the dataset.
Stories expire quickly. A valid profile with no active public story when the Actor checks it produces no row.
⚙️ Input
Input fields
| Field | Type | What it does |
|---|---|---|
targets | array of strings | Required. Add 1 to 500 unique TikTok usernames, @handles, or public profile URLs. The form starts with jasonderulo, jamescharles, and spencerx. |
maxStoriesPerProfile | integer | Optional limit for active stories saved from each profile. Leave it empty or enter 0 to get all active stories. The form starts with 10, but there is no schema default. |
sortStories | string | Sets the order for stories from each profile: newest, oldest, or profileOrder. The default is newest. |
Example input
This is the public input from a successful run with the form's starting values:
{"targets": ["jasonderulo","jamescharles","spencerx"],"maxStoriesPerProfile": 10,"sortStories": "newest"}
🧾 Output
Output fields
All rows use the same object shape for video and photo-style stories. Values can be null when TikTok does not provide them.
| Field | Type | What it does |
|---|---|---|
storyId | string | Stable TikTok ID for the story. |
storyType | string | Kind of story: photo for a photo story or video for a video story. |
videoId | string or null | TikTok video ID for the story media when provided. |
profileUsername | string | Username of the TikTok profile that posted the story. |
createdAt | string or null | Story creation time when provided. |
stickerTexts | array of strings | Text shown on the story's stickers. Empty when the story has no sticker text. |
region | string or null | Region code TikTok lists for the story, such as US. |
durationSeconds | integer or null | Story video length in seconds when provided. |
isAd | boolean or null | Whether TikTok marks the story as an ad when the flag is provided. |
author | object | TikTok account details for the story author. |
author.id | string or null | TikTok user ID when provided. |
author.username | string or null | TikTok username for the author when provided. |
author.name | string or null | Author display name when provided. |
author.avatarUrl | string or null | Public author avatar image URL when provided. |
author.isVerified | boolean or null | Whether TikTok shows a verified badge on the author account. |
author.followerCount | integer or null | Number of followers of the author account when provided. |
media | object | Direct media links, video size in pixels, and file sizes for the story. |
media.videoUrl | string or null | Direct story video URL without a watermark when TikTok provides it. |
media.watermarkedVideoUrl | string or null | Story video URL with a TikTok watermark when it differs from media.videoUrl; otherwise null. The link gives the file only when the request sends the header Referer: https://www.tiktok.com/. If you open it directly in a browser, TikTok returns an error. |
media.coverUrl | string or null | Story cover image URL when provided. |
media.dynamicCoverUrl | string or null | Animated story cover image URL when provided. |
media.originCoverUrl | string or null | Original story cover image URL when provided. |
media.width | integer or null | Story video width in pixels when provided. |
media.height | integer or null | Story video height in pixels when provided. |
media.sizeBytes | integer or null | Video file size in bytes when provided. |
media.watermarkedSizeBytes | integer or null | Watermarked video file size in bytes when provided. |
media.photoSlides | array of objects | Photo slides for a photo story. Video stories may have an empty list or leave this field out. |
media.photoSlides[].url | string | Direct URL for one photo slide in a photo story. |
media.photoSlides[].sizeBytes | integer | Photo slide file size in bytes. Left out when TikTok does not provide it. |
engagement | object | Engagement counts for the story when provided. |
engagement.playCount | integer or null | Number of story views when provided. |
engagement.likeCount | integer or null | Number of story likes when provided. |
engagement.commentCount | integer or null | Number of story comments when provided. |
engagement.shareCount | integer or null | Number of story shares when provided. |
engagement.collectCount | integer or null | Number of story saves when provided. |
music | object | TikTok sound or music details for the story. |
music.id | string or null | TikTok music or sound ID when provided. |
music.title | string or null | Music or sound title when provided. |
music.author | string or null | Music author or sound creator when provided. |
music.playUrl | string or null | Story audio URL when TikTok provides it. The link gives the file only when the request sends the header Referer: https://www.tiktok.com/. If you open it directly in a browser, TikTok returns an error. |
music.coverUrl | string or null | Music cover image URL when provided. |
music.durationSeconds | integer or null | Music or sound length in seconds when provided. |
music.isOriginal | boolean or null | Whether TikTok marks the sound as original when the flag is provided. |
Example row
This complete video story row came from a successful run of the current build. Video stories have direct video links, a cover, and sticker text when the story shows it.
{"storyId": "7703703328076729613","storyType": "video","videoId": "7703703328076729613","profileUsername": "spencerx","createdAt": "2026-11-02T22:23:56.000Z","stickerTexts": ["Everyone follow @LVLX "],"region": "US","durationSeconds": 27,"isAd": false,"author": {"id": "6524904798586672143","username": "spencerx","name": "Spencer X","avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/920bdbdf89cc05a5254b985625012e27~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=7a31916e&x-expires=1793880000&x-signature=0zQfPVGlAMtlvAFBjJl69aBSiSs%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5","isVerified": true,"followerCount": 53400000},"media": {"videoUrl": "https://www.tiktok.com/aweme/v1/play/?faid=1988&file_id=bab6b0fd8068496b8ebab839ca9bf945&is_play_url=1&item_id=7703703328076729613&line=0&ply_type=2&pt=YXdlbWUud2ViLndlYmFwaSYvYXBpL3N0b3J5L2l0ZW1fbGlzdC8mMjAyNjExMDMxMjIxNTQ3MUM1QUU0NUY5Q0M2NjA5NzUxQSYxNzkzNzA4NTE0JmI4N2M1MTM5NjI4ZA&signaturev3=dmlkZW9faWQ7ZmlsZV9pZDtpdGVtX2lkLjc5NTNlNjg3NzIxNjhjZWY5YjhjNmY4ODczYzAyNWQy&tk=tt_chain_token&video_id=v12044gd0000dbkgqufog65qeooslva0","watermarkedVideoUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-useast5-ve-0068c001-tx/oE2QweeMHGG0ckrSAoLHArIIjAp7g3zeIFCVNh/?a=1988&bti=ODszNWYuMDE6&&bt=771&ft=FLr6B6BMyq8vG8rFE12S~3RYztGxRf&mime_type=video_mp4&rc=ZmZmOmU5aDxnZGk8NGVkNkBpM3l2cnQ5cnhqZTMzZzczNEAtLS02My5jXi8xNC9eMmA1YSNeaWxiMmRjbmhhLS1kMS9zcw%3D%3D&expire=1793881341&l=2026110312215471C5AE45F9CC6609751A&ply_type=2&policy=2&signature=b93f284c313b9cc774ca1f5e2aa0be90&tk=tt_chain_token&btag=e000b8000","coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/osr0GepzIIOkQXDe2CVALCMpIqjhAerobHxEcO~tplv-tiktokx-origin.image?dr=9636&x-expires=1793880000&x-signature=Gus6NASLoKY2v9Hpa6WZyG%2BJfBI%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","dynamicCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/oovBfDfEzg6Xq5US7IB1RVAXWGI7FOE5D07QDp~tplv-tiktokx-origin.image?dr=9636&x-expires=1793880000&x-signature=QWI34lKLDrNG%2BCs1spxlf2xHoW8%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","originCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/okABpLrzr02XGDWvjeMCh6IpAkIUHfmQeV4cQo~tplv-tiktokx-origin.image?dr=9636&x-expires=1793880000&x-signature=OI%2FSo3uJrGz9ZMzMPxlGIN9mksk%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","width": 720,"height": 1280,"sizeBytes": 2986360,"watermarkedSizeBytes": 2728899,"photoSlides": []},"engagement": {"playCount": 5434,"likeCount": 61,"commentCount": 0,"shareCount": 1,"collectCount": 0},"music": {"id": "7702277265194863373","title": "original sound","author": "LVL X","playUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-useast5-v-27dcd7-tx/oooHTfgyVIkAoAHofCxFYHxEIlDAXVE7lAfIGy/?a=1988&bti=ODszNWYuMDE6&&bt=125&ft=GcAInInz7ThmYhAGXq8Zmo&mime_type=audio_mpeg&rc=M25leG45cnN5ZTMzZzU8NEBpM25leG45cnN5ZTMzZzU8NEA1b14yMmRjbGVhLS1kMS9zYSM1b14yMmRjbGVhLS1kMS9zcw%3D%3D&expire=1793730141&l=2026110312215471C5AE45F9CC6609751A&ply_type=3&policy=3&signature=d628b583ddf5c5f374d21394138112cd&tk=0&btag=e00078000","coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/97d8b7f623ec1545ead03bd1008ffdc5~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=1cec92a8&x-expires=1793880000&x-signature=WUq4vxuPAlNMNRjBXMjp3T2%2FqjU%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5","durationSeconds": 27,"isOriginal": true}}
💳 Pricing
This Actor uses pay-per-event pricing. You are charged once for each active public TikTok story saved to the dataset. A valid profile with no active public stories produces no story row or story event.
🔌 Integrations
Use it with
- Export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.
- Call the Actor through the Apify API.
- Schedule repeat checks for the same profiles.
- Send completed dataset rows to webhooks or your own workflow.
❓ FAQ
What do the two video URL fields mean?
media.videoUrl is the direct story video URL without a watermark when TikTok provides it. media.watermarkedVideoUrl is a separate watermarked URL when TikTok provides one that differs from it. Otherwise, media.watermarkedVideoUrl is null.
What happens when a target is invalid?
Each target must be a TikTok username, @handle, or public profile URL. If all submitted targets are invalid, the run completes with no story rows and reports that no valid profile was processed. This is different from a valid profile with no active story.
What happens when a valid profile has no active story?
When a valid public profile is processed and no active public story is found, the Actor saves no row for that profile and reports a no-match outcome. Stories expire quickly, so a later run can return different results.
What happens with a private, hidden, or unknown profile?
The Actor skips a private profile, a profile TikTok cannot find, or a creator who shows the profile only to logged-in viewers. It logs a warning and keeps checking the other profiles. It saves no row for that profile.
Why did my run fail with no results?
If TikTok stories could not be checked for any submitted profile and no story was saved, the run ends as failed so you do not read it as a profile with no stories. No story event is charged. Try the run again later. If at least one story was saved, the run does not fail because of other profiles.
What if the run reaches its charge limit?
The native charge limit can stop collection before another story row is saved. The run reports a charge-limited outcome and keeps any rows already collected, including zero rows. It does not report source exhaustion or no active public stories for that stop.
Why is an output field null?
TikTok does not expose every value for every story. Photo-style stories can have null video links, and music or cover fields can also be unavailable.
Can I limit stories or change their order?
Yes. Set Story limit per profile to a positive number for a per-profile cap, or leave it empty or enter 0 to get all active stories. Story order supports newest, oldest, and profileOrder.
Are regular TikTok videos included?
No. This Actor checks active public stories from profiles. It does not scrape regular profile videos, TikTok search, comments, hashtags, or followers.
Can I use this as an anonymous TikTok story viewer?
You do not need a TikTok account, login, cookies, or API key. The Actor reads public stories only and cannot provide private or unavailable content.
Is it safe to use this TikTok story viewer?
The Actor reads public stories only and needs no TikTok login. It does not save media files in Apify storage. You are responsible for how you use the data, so check TikTok's terms and the laws that apply to you.
Does this save video files?
No. It returns source media URLs and metadata. Media URLs can expire, so process important links soon after the run. The watermarked video link and the music link give the file only when the request sends the header Referer: https://www.tiktok.com/. If you open them directly in a browser, TikTok returns an error.
Can I run it on a schedule?
Yes. You can schedule the Actor on Apify, call it through the API, and send dataset rows to webhooks or other supported workflows.
📝 Changelog
v2.1 (30-10-2026)
- Story rows now include
stickerTextsandregion. - The
authorobject now includesisVerifiedandfollowerCount. - The
mediaobject now includes the videowidthandheightin pixels. - Set the Story limit to 0 to get all active stories.
- Runs now use 128 MB of memory by default. The minimum is 128 MB, and the maximum is 256 MB.
- The example profiles in the input form are now
tiktokandwnba. - Reliability improvements.
v2.0 (15-10-2026)
- Breaking change: For photo stories,
media.videoUrl,media.watermarkedVideoUrl,media.sizeBytes, andmedia.watermarkedSizeBytesare now alwaysnull. Before, they could have values when TikTok sent video data. - Each story row now has a
storyTypefield:photoorvideo. - Photo stories now list their photos in
media.photoSlides. Each photo has a direct link. Photos without a usable link are left out. - Runs now need at least 2048 MB of memory, up from 1024 MB. The default is 2048 MB, and the maximum is 4096 MB.
- Runs can now finish before their timeout.
- A run that saved stories no longer fails just because every profile check failed.
- A failed run now shows a short, plain message in its log instead of a long technical error.
- With a Story limit set,
newestandoldestnow choose from every active story. Before, they could miss some stories. - If no stories are found and some profiles could not be checked, the run log now says so.
- At startup, run logs show only warnings and errors. The Apify SDK system info line no longer appears.
- The Actor has a new icon.
- The example profiles in the input form are now
jamescharlesandwnba.
v1.1 (04-09-2026)
- Story rows now include the watermarked video file size when TikTok provides it.
v1.0
- Story rows now provide a distinct watermarked video link when TikTok exposes one, or
nullwhen no distinct link is available.
v0.1
- Initial release.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Related Actors
- Instagram Stories Scraper - Collect active Stories from public Instagram profiles.
- Snapchat Story Viewer - Collect public Snapchat stories and highlights from profiles.
- TikTok Profile Videos API Scraper - Collect regular public TikTok profile videos from known profiles.
- TikTok Video Downloader - Get direct video or audio links from known public TikTok video URLs.
- TikTok Slideshow Downloader - Download photos from public TikTok slideshow URLs.
Made with ❤️ by Maxime Dupré