TikTok Story Viewer avatar

TikTok Story Viewer

Pricing

from $0.01 / 1,000 stories

Go to Apify Store
TikTok Story Viewer

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 $0.01 / 1,000 stories

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

22

Total users

9

Monthly active users

4 days ago

Last modified

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.

📦 Active TikTok story data

Each saved row represents one active public TikTok story. 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 and can have null video links while cover data remains available.

🚀 Check public TikTok stories

  1. Add one or more profiles in TikTok profiles.
  2. Enter usernames such as hbomax, @handles such as @tiktok, or public profile URLs such as https://www.tiktok.com/@tiktok.
  3. 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.
  4. Choose Story order as newest, oldest, or profileOrder.
  5. Start the Actor and open the dataset.

Stories expire quickly. A profile with no active public story when the Actor checks it produces no row.

⚙️ Input

Input fields

FieldTypeWhat it does
targetsarray of stringsRequired. Add up to 500 TikTok usernames, @handles, or public profile URLs.
maxStoriesPerProfileintegerOptional positive limit for active stories saved from each profile. Leave it empty to return all available results until the source is exhausted.
sortStoriesstringSets the order for stories from each profile: newest, oldest, or profileOrder.

Example input

This is the public input from a successful run:

{
"targets": [
"hbo",
"hbomax",
"jamescharles",
"tiktok",
"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

FieldTypeWhat it does
resultsstringLink to the default dataset containing the active public TikTok story rows.

Dataset row fields

FieldTypeWhat it does
storyIdstringStable TikTok ID for the story.
videoIdstring or nullTikTok video ID for the story media when provided.
profileUsernamestringUsername of the TikTok profile that posted the story.
createdAtstring or nullStory creation time when provided.
durationSecondsinteger or nullStory video length in seconds when provided.
isAdboolean or nullWhether TikTok marks the story as an ad when the flag is provided.
authorobjectTikTok account details for the story author.
author.idstring or nullTikTok user ID when provided.
author.usernamestring or nullTikTok username for the author when provided.
author.namestring or nullAuthor display name when provided.
author.avatarUrlstring or nullPublic author avatar image URL when provided.
mediaobjectDirect media links and file size for the story.
media.videoUrlstring or nullDirect story video URL without a watermark when TikTok provides it.
media.watermarkedVideoUrlstring or nullDirect story video URL with a TikTok watermark when it differs from media.videoUrl; otherwise null.
media.coverUrlstring or nullStory cover image URL when provided.
media.dynamicCoverUrlstring or nullAnimated story cover image URL when provided.
media.originCoverUrlstring or nullOriginal story cover image URL when provided.
media.sizeBytesinteger or nullVideo file size in bytes when provided.
media.watermarkedSizeBytesinteger or nullWatermarked video file size in bytes when provided.
engagementobjectEngagement counts for the story when provided.
engagement.playCountinteger or nullNumber of story views when provided.
engagement.likeCountinteger or nullNumber of story likes when provided.
engagement.commentCountinteger or nullNumber of story comments when provided.
engagement.shareCountinteger or nullNumber of story shares when provided.
engagement.collectCountinteger or nullNumber of story saves when provided.
musicobjectTikTok sound or music details for the story.
music.idstring or nullTikTok music or sound ID when provided.
music.titlestring or nullMusic or sound title when provided.
music.authorstring or nullMusic author or sound creator when provided.
music.playUrlstring or nullDirect audio URL when TikTok provides it.
music.coverUrlstring or nullMusic cover image URL when provided.
music.durationSecondsinteger or nullMusic or sound length in seconds when provided.
music.isOriginalboolean or nullWhether TikTok marks the sound as original when the flag is provided.

Example row

This complete row came from the newest successful run on beta build 1.0.3. The two video links are distinct.

{
"storyId": "7681417871670627597",
"videoId": "7681417871670627597",
"profileUsername": "jamescharles",
"createdAt": "2026-09-03T21:04:36.000Z",
"durationSeconds": 28,
"isAd": false,
"author": {
"id": "190068318278651904",
"username": "jamescharles",
"name": "James Charles",
"avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/56ac3316193300d4e8295c752415cced~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=f9f5b8ed&x-expires=1788717600&x-signature=sx3lXTe5ohFxweBtIglBEPttnME%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5"
},
"media": {
"videoUrl": "https://www.tiktok.com/aweme/v1/play/?faid=1988&file_id=571044f0a8ce463897cb16553b3506d1&is_play_url=1&item_id=7681417871670627597&line=0&ply_type=2&pt=YXdlbWUud2ViLndlYmFwaSYvYXBpL3N0b3J5L2l0ZW1fbGlzdC8mMjAyNjA5MDQxODM1MjE4Q0JGMDdBQUIzRTNBNjIyNDczMSYxNzg4NTQ2OTIxJmJjMGQ4YWMyZjRjOQ&signaturev3=dmlkZW9faWQ7ZmlsZV9pZDtpdGVtX2lkLjg2OGJhMGZjN2YxNDVmZjIwZmZiYzFmNmFjNDM1ZmRj&tk=tt_chain_token&video_id=v12044gd0000dacu1k7og65pbl63ajl0",
"watermarkedVideoUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-useast5-ve-0068c001-tx/oEgBuAIAUpXiaP0Bg44Ww5qUEP6EZP1ATUqni/?a=1988&bti=ODszNWYuMDE6&&bt=283&ft=aEeq8qT0mIoPD12xqZzI3wUB5zAbMeF~O5&mime_type=video_mp4&rc=PGU7ZWdlOjlnNTxpO2hkN0BpM202b3M5cm54ZDMzZzczNEAyMWBeNC0tXy4xXmA0YWI2YSNpXjNfMmQ0LmBhLS1kMS9zcw%3D%3D&expire=1788719749&l=202609041835218CBF07AAB3E3A6224731&ply_type=2&policy=2&signature=d8216587f62d75a09a92c072a5b155c0&tk=tt_chain_token&btag=e000b8000",
"coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/oAPOnEBA05A0HsnBm4gI4iUXwRZT1aUEqgpAi~tplv-tiktokx-origin.image?dr=9636&x-expires=1788717600&x-signature=%2B8lzY%2FQ%2B9HRMu%2FYzW2tL4BrVPQY%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
"dynamicCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/o8tA1qbEI7XUT5OPZpi4AwIK0EngiBag4UvyB~tplv-tiktokx-origin.image?dr=9636&x-expires=1788717600&x-signature=l0nPcErYJ5WN4PYI2is6e5o2CyU%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
"originCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/okVMeyn4QbeUCquIQQOZYHAYBjFOVkfpcAhDDE~tplv-tiktokx-origin.image?dr=9636&x-expires=1788717600&x-signature=vRRQLbNECBp3%2FFmRp8rSfG4xNdk%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
"sizeBytes": 1106218,
"watermarkedSizeBytes": 1043109
},
"engagement": {
"playCount": 67100,
"likeCount": 1776,
"commentCount": 0,
"shareCount": 19,
"collectCount": 0
},
"music": {
"id": "7681414456747756301",
"title": "original sound",
"author": "James Charles",
"playUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-useast5-v-27dcd7-tx/oseZJdWIqESAUADl3BmF1C3EEtDALqCLKgfYcA/?a=1988&bti=ODszNWYuMDE6&&bt=125&ft=GcAInInz7ThZa3LGXq8Zmo&mime_type=audio_mpeg&rc=M3h0cmw5cmx3ZDMzZzU8NEBpM3h0cmw5cmx3ZDMzZzU8NEBfXy9mMmRrb2BhLS1kMS9zYSNfXy9mMmRrb2BhLS1kMS9zcw%3D%3D&expire=1788568549&l=202609041835218CBF07AAB3E3A6224731&ply_type=3&policy=3&signature=feba1e9395a35d2079fdb4a347f1a7c9&tk=0&btag=e00078000",
"coverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/56ac3316193300d4e8295c752415cced~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=f9f5b8ed&x-expires=1788717600&x-signature=sx3lXTe5ohFxweBtIglBEPttnME%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
"durationSeconds": 28,
"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 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 profile has no active story?

The Actor saves no row for that profile. Stories expire quickly, so a later run can return different results.

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.

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

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 null when 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 🫡

Made with ❤️ by Maxime Dupré