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
35
Total users
6
Monthly active users
8 days ago
Last modified
Categories
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, 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 TikTok Anonymous Viewer Story.
- Export active stories for a submitted profile with TikTok Viewer Story.
- Check current public stories from several profiles with TikTok Story Viewer Anonymous.
- Gather story links and metadata for creator research with TikTok Viewer Anonymous.
- Review the photo slides and cover images from a creator's active public stories.
📦 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.
🚀 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 to return all available results until the source is exhausted, 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 up to 500 TikTok usernames, @handles, or public profile URLs. |
maxStoriesPerProfile | integer | Optional positive limit for active stories saved from each profile. Leave it empty to return all available results until the source is exhausted. |
sortStories | string | Sets the order for stories from each profile: newest, oldest, or profileOrder. |
Example input
This is the public input from a successful run:
{"targets": ["jamescharles","wnba"],"maxStoriesPerProfile": 10,"sortStories": "newest"}
🧾 Output
All rows use the same object shape for video and photo-style stories. Values can be null when TikTok does not provide them.
Output link
| Field | Type | What it does |
|---|---|---|
results | string | Link to the default dataset containing the active public TikTok story rows. |
Dataset row fields
| 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. |
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. |
media | object | Direct media links and file size for the story. |
media.videoUrl | string or null | Direct story video URL without a watermark when TikTok provides it. |
media.watermarkedVideoUrl | string or null | Direct story video URL with a TikTok watermark when it differs from media.videoUrl; otherwise null. |
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.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 | Direct audio URL when TikTok provides it. |
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 on beta build 1.1.8. It shows separate unwatermarked and watermarked links.
{"storyId": "7696653157547412769","storyType": "video","videoId": "7696653157547412769","profileUsername": "realmadrid","createdAt": "2026-10-14T22:25:14.000Z","durationSeconds": 4,"isAd": false,"author": {"id": "6693776501107033094","username": "realmadrid","name": "Real Madrid C.F.","avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/1fac4d07e50f4e3d8612240ecf8abf66~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=73298527&x-expires=1792206000&x-signature=UlIS5MKuva7%2Fms7fUN5LHfpoGBY%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5"},"media": {"videoUrl": "https://www.tiktok.com/aweme/v1/play/?faid=1988&file_id=f8e8778dd6a34ebbbdad6ba70c4e1c8a&is_play_url=1&item_id=7696653157547412769&line=0&ply_type=2&pt=YXdlbWUud2ViLndlYmFwaSYvYXBpL3N0b3J5L2l0ZW1fbGlzdC8mMjAyNjEwMTUwMzE2MjExQkRCNkJFMjBDRURDRTA0NkM3NCYxNzkyMDM0MTgxJjMzNGNjYTVkMmQ1Mw&signaturev3=dmlkZW9faWQ7ZmlsZV9pZDtpdGVtX2lkLmYwNTAxZTlkZTJhMDUwNGU2ZmJmN2I3NWNmMTFkYzJm&tk=tt_chain_token&video_id=v26044gc0000db802hnog65gk28r4au0","watermarkedVideoUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast2a/tos-useast2a-ve-0068-euttp/oM2UAIoGghqA4SeASpEGBF0ERDpDQQFmNQfWkV/?a=1988&bti=ODszNWYuMDE6&&bt=1128&ft=aEeq8qT0mIoPD12YeYTI3wUZugAbMeF~O5&mime_type=video_mp4&rc=OWg3Nzo5ZmZlNmc7PDw6O0BpM2R1NWo5cmszZTMzZjczNUAvXi9hYDVhNS0xNTUtYi5iYSNyMTVoMmRrLzVhLS1kMTNzcw%3D%3D&expire=1792206985&l=202610150316211BDB6BE20CEDCE046C74&ply_type=2&policy=2&signature=cbf86b6ccc0f841896f191330fb57963&tk=tt_chain_token&btag=e000b8000","coverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/oY0ZvKoIgU5irBAwEAdRtBa8i8SyQJAqBEGAB~tplv-tiktokx-origin.image?dr=9636&x-expires=1792206000&x-signature=%2Bqkt9odfQNficR0mMG7KD9a5Z1Q%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","dynamicCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/oAQokEANqDevAVGhADBOzEp0FCFQmQfRUESQQ4~tplv-tiktokx-origin.image?dr=9636&x-expires=1792206000&x-signature=2Y3J9Llt7m2NqHyAMP4ZqHw1fRE%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","originCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/owRaH0AGjQBZMUAoiisvtIIRwGAJyyBBKAE8g~tplv-tiktokx-origin.image?dr=9636&x-expires=1792206000&x-signature=cxcoguxnosMLLu43hEfWC5HetE4%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","sizeBytes": 658795,"watermarkedSizeBytes": 676274,"photoSlides": []},"engagement": {"playCount": 197100,"likeCount": 25700,"commentCount": 0,"shareCount": 159,"collectCount": 0},"music": {"id": "7696642298238602016","title": "sonido original","author": "Real Madrid C.F.","playUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast2a/tos-useast2a-v-2370-euttp/ogDiU9u2EYxUmEzBkPmBfDVJu0CiAAfQAmNqEs/?a=1988&bti=ODszNWYuMDE6&&bt=125&ft=GcAInInz7ThQSQKGXq8Zmo&mime_type=audio_mpeg&rc=ajdsZWs5cnR5ZTMzZjU8NUBpajdsZWs5cnR5ZTMzZjU8NUBecS9gMmRjYjRhLS1kMTNzYSNecS9gMmRjYjRhLS1kMTNzcw%3D%3D&expire=1792055785&l=202610150316211BDB6BE20CEDCE046C74&ply_type=3&policy=3&signature=227c5b6203d305f17984fc72122c5830&tk=0&btag=e00078000","coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/1fac4d07e50f4e3d8612240ecf8abf66~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=73298527&x-expires=1792206000&x-signature=UlIS5MKuva7%2Fms7fUN5LHfpoGBY%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5","durationSeconds": 4,"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 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 to return all available results until the source is exhausted. 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.
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.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é