TikTok Slideshow Downloader avatar

TikTok Slideshow Downloader

Pricing

from $2.70 / 1,000 downloaded photos

Go to Apify Store
TikTok Slideshow Downloader

TikTok Slideshow Downloader

Download photos from public TikTok slideshow URLs. Save each image to Apify storage with source links, author data, captions, post stats, file metadata, and dataset exports.

Pricing

from $2.70 / 1,000 downloaded photos

Rating

5.0

(1)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

2

Bookmarked

81

Total users

16

Monthly active users

4.3 hours

Issues response

16 hours ago

Last modified

Share

📥 Download TikTok slideshow photos from known public posts

TikTok Slideshow Downloader is for researchers, creators, and social media teams who have public TikTok photo-post links. It saves each available slideshow photo in order and returns a directly retrievable Apify storage link with source post details and public metadata in a dataset. Full photo-post links, supported short-share links, and numeric post IDs are accepted.

Use cases

📦 Saved photos and source details

What each row contains

Each dataset row is one unique photo that was downloaded and saved. Each saved photo has one matching downloadUrl for its stored file. If the same TikTok post is submitted more than once, the Actor keeps the first saved match and ignores later references. It keeps the submitted reference, resolved post link, post ID, photo position, saved-file link, file properties, source image link, creator and caption data, public post counts, sound details, and custom data when provided. TikTok may leave optional values null. The Actor does not save a failure row for a skipped link or photo that could not be downloaded.

🚀 Run the TikTok slideshow downloader

Run steps

  1. Add one or more public TikTok photo-post links, supported short-share links, or numeric post IDs.
  2. Set Photo limit when you want to stop after a chosen number of saved photos.
  3. Change File name pattern if you want a different stored-file name.
  4. Start the Actor and open Downloaded photos.
  5. Use each downloadUrl to fetch the saved image.

Limits and choices

The input accepts up to 500 submitted references. maxItems has no fixed upper bound in the schema. Leave Photo limit empty to return all available results until the source is exhausted.

⚙️ Input

Input fields

FieldTypeWhat it does
slideshowUrlsarray of objectsAdd at least one and at most 500 full public photo-post links, supported short-share links, or numeric post IDs.
slideshowUrls[].urlstringThe public photo-post link, supported short-share link, or numeric post ID to process.
slideshowUrls[].userDataobjectOptional custom data attached to the submitted reference and passed to its saved photo rows.
maxItemsintegerOptional total photo limit. Set a positive number to stop after that many saved photos. Leave it empty to return all available results until the source is exhausted. The form pre-fills 3 for a small test.
fileNamePatternstringPattern for stored image names. Use {postId}, {photoIndex}, and {extension}. The length must be from 1 to 200 characters.

Example input

This is the public input from a successful run with the prefilled photo link, photo limit, and file name pattern.

{
"slideshowUrls": [
{
"url": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645"
}
],
"maxItems": 3,
"fileNamePattern": "{postId}-photo-{photoIndex}.{extension}"
}

🧾 Output

Output fields

The results field links to the saved dataset. Each dataset row has the fields below.

FieldTypeWhat it does
resultsstringDataset link for the saved photo rows.
inputIndexintegerPosition of the submitted reference in the Actor input.
requestedUrlstringReference submitted in the Actor input.
sourceUrlstringResolved public TikTok photo-post link.
videoIdstringTikTok post ID.
authorUsernamestring or nullCreator username when TikTok provides it.
authorNamestring or nullCreator display name when TikTok provides it.
captionstring or nullPublic post caption when TikTok provides it.
photoIndexintegerPhoto position in the slideshow, starting at 1.
photoCountintegerTotal photo count in the source slideshow.
downloadUrlstringDirectly retrievable Apify storage-record link for the saved photo.
fileNamestringName of the saved photo file.
contentTypestringMedia type of the saved photo, such as image/jpeg.
fileSizeBytesintegerSaved photo size in bytes.
imageWidthinteger or nullPhoto width in pixels when available.
imageHeightinteger or nullPhoto height in pixels when available.
sourceImageUrlstringOriginal TikTok image link for the photo. It is a source reference, not the saved-file link.
userDataobjectCustom data passed with the submitted reference, when provided.
postobjectPublic counts for the source post.
post.playCountinteger or nullPublic view count when available.
post.likeCountinteger or nullPublic like count when available.
post.commentCountinteger or nullPublic comment count when available.
post.shareCountinteger or nullPublic share count when available.
post.collectCountinteger or nullPublic save count when available.
audioobjectPublic sound details for the source post.
audio.idstring or nullTikTok sound ID when available.
audio.titlestring or nullSound title when available.
audio.authorNamestring or nullSound creator name when available.
audio.originalboolean or nullWhether TikTok marks the sound as original.
audio.durationSecondsnumber or nullSound length in seconds when available.

Example saved photo row

This complete row came from a successful current-beta run. Optional userData was not present in this row.

{
"inputIndex": 0,
"requestedUrl": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645",
"sourceUrl": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645",
"videoId": "7498924643227536645",
"authorUsername": "anamiriamyepez",
"authorName": "Ana Miriam Yepez Arreola",
"caption": "¡Podemos tener más comunicación! 📣, escanea el código QR y contáctame. 👩🏻‍⚖️⚖️ 💚 💞 🇲🇽 #MiriamYépez #Vota20 #JusticiaConRostroHumano #EleccionesJudiciales2025 🗳️",
"photoIndex": 1,
"photoCount": 3,
"fileName": "7498924643227536645-photo-1.jpg",
"contentType": "image/jpeg",
"fileSizeBytes": 90286,
"imageWidth": 1080,
"imageHeight": 1080,
"sourceImageUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-i-photomode-us/4e11f114a249493eb708aa9977d014ca~tplv-photomode-image.jpeg?dr=9616&x-expires=1788994800&x-signature=w7SNqL2IdAQZax5CbZ5DxqY86u0%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=9b759fb9&idc=useast5&ftpl=1",
"post": {
"playCount": 10700,
"likeCount": 53,
"commentCount": 33,
"shareCount": 3,
"collectCount": 0
},
"audio": {
"id": "7210195541555169281",
"title": "Cyber Techno",
"authorName": "Ganger Baster",
"original": false,
"durationSeconds": 179
},
"downloadUrl": "https://api.apify.com/v2/key-value-stores/KhP8BGqYx1kS54nnB/records/tiktok-slideshow-0-7498924643227536645-1?signature=17V4q3XDzWyaEVL7vXf9t"
}

Some values can be null when TikTok does not publish them.

💳 Pricing

Charged event

Pay-per-event pricing charges one Downloaded photo event for each unique slideshow photo that is downloaded and saved to storage. Skipped links and photos that cannot be downloaded do not create that event. A run with no saved photos has no downloaded-photo event.

🔌 Integrations

Use the saved dataset

Open the results dataset link in Apify, export rows as JSON, CSV, Excel, XML, RSS, or HTML, or call the dataset through the Apify API. You can also use Apify schedules, webhooks, and integrations with the dataset. This guide shows how to connect Apify Actors with other tools:

❓ FAQ

What happens if a slideshow has fewer photos than my limit?

The Actor saves the available photos and moves on. If you leave maxItems empty, it returns all available results until the source is exhausted.

Can I use a short-share link or a numeric post ID?

Yes. The Actor follows supported short-share links first. The final target must be a public TikTok /photo/ post. Numeric post IDs that identify public photo posts are also accepted.

Can I process several posts in one run?

Yes. Add up to 500 known public slideshow references. The maxItems limit controls the total saved photos across the run.

What does one dataset row represent?

One row represents one unique photo that was downloaded and saved. It includes one matching downloadUrl, the photo order, source post details, and available public metadata. If the same source post appears again through another submitted reference, the later match is ignored.

What happens if a run is resumed?

Previously saved photos remain available. Each unique saved photo has one dataset row with its matching downloadUrl, and the completion summary matches the number of unique saved photos.

Does it download normal TikTok videos or audio?

No. It downloads images from public TikTok photo and slideshow posts. It does not download video, standalone audio, or cover files.

Can I use it as a TikTok slideshow downloader without watermark?

No. It saves the slideshow images TikTok makes available. It does not edit, upscale, or remove marks from an image, and it does not promise HD or 4K output.

Do I need a TikTok account or API key?

No. Use public photo posts without a customer-provided source credential. Private, deleted, unavailable, region-limited, and login-only posts are not supported.

Can it find slideshow posts for me?

No. You must give it known post links or IDs. It does not search profiles, hashtags, feeds, comments, shops, or trends.

The Actor skips it and continues with the remaining eligible work. It does not save a failure row. Public data and downloadable images can vary based on what TikTok provides at run time.

📝 Changelog

v1.0 (01-09-2026)

  • Output rows now use directly retrievable Apify storage-record links for saved images; storageKey and scrapedAt are no longer emitted.
  • Numeric TikTok post IDs are accepted alongside public photo-post and supported short-share links.
  • Temporary source-access failures are retried, and warnings describe only photos that remain unavailable while processing continues.

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é