# TikTok Slideshow Downloader (`parsebird/tiktok-slideshow-downloader`) Actor

Download TikTok slideshow photos from photo-post links, short links, or post IDs. Saves every image as a file with a direct download link, plus caption, author, stats, and sound details.

- **URL**: https://apify.com/parsebird/tiktok-slideshow-downloader.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 tiktok slideshow photos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### TikTok Slideshow Downloader

TikTok Slideshow Downloader saves every photo from public [TikTok](https://www.tiktok.com/) slideshow (photo mode) posts as image files, each with a direct download link and the post's caption, author, engagement counts, and sound details.

<table><tr>
<td style="border-left:4px solid #FE2C55;padding:12px 16px;font-weight:600">
Paste up to 500 TikTok photo-post links, short-share links, or post IDs and get one row per photo with a ready-to-use download link, image size and dimensions, custom file names, and 20+ post and sound fields.
</td>
</tr></table>

<br>

<table>
<tr>
<td colspan="4" style="padding:10px 14px;background:#FE2C55;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">ParseBird TikTok Suite</span>
<span style="color:#FFD6DE;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Video, story, LIVE &amp; shop data</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 0 4px;border-right:none;border-top:none;vertical-align:top;width:25%;background:#FFEEF1">
<a href="https://apify.com/parsebird/tiktok-slideshow-downloader" style="color:#FE2C55;text-decoration:none;font-weight:700;font-size:13px">TikTok Slideshow Downloader</a><br>
<span style="color:#FE2C55;font-size:11px;font-weight:600">You are here</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:25%;background:#FFFFFF">
<a href="https://apify.com/parsebird/tiktok-story-viewer" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">TikTok Story Viewer</a><br>
<span style="color:#78716C;font-size:11px">Active stories, no-watermark video</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:25%;background:#FFFFFF">
<a href="https://apify.com/parsebird/tiktok-live-search-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">TikTok Live Search Scraper</a><br>
<span style="color:#78716C;font-size:11px">LIVE rooms by keyword</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 4px 0;border-top:none;vertical-align:top;width:25%;background:#FFFFFF">
<a href="https://apify.com/parsebird/tiktok-shop-reviews-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">TikTok Shop Reviews Scraper</a><br>
<span style="color:#78716C;font-size:11px">Product reviews and ratings</span>
</td>
</tr>
</table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use Apify Actor parsebird/tiktok-slideshow-downloader to download all photos from public TikTok slideshow (photo mode) posts. Example with ApifyClient (Python): client.actor("parsebird/tiktok-slideshow-downloader").call(run_input={"slideshowUrls":[{"url":"https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645"}],"maxItems":3,"fileNamePattern":"{postId}-photo-{photoIndex}.{extension}"}). Inputs: slideshowUrls array of {url, userData?} objects, required, 1-500 items, url accepts a TikTok photo-post link, vm.tiktok.com / vt.tiktok.com / tiktok.com/t/ short link, or numeric post ID, userData is optional custom JSON copied to every photo row; maxItems integer optional, total photo limit, empty = all photos; fileNamePattern string optional default "{postId}-photo-{photoIndex}.{extension}" (1-200 chars). Output: one dataset row per saved photo with inputIndex, requestedUrl, sourceUrl, videoId, authorUsername, authorName, caption, photoIndex, photoCount, fileName, contentType, fileSizeBytes, imageWidth, imageHeight, sourceImageUrl, userData, post{playCount,likeCount,commentCount,shareCount,collectCount}, audio{id,title,authorName,original,durationSeconds}, downloadUrl (direct Apify key-value store link to the saved image). Video posts, private posts, and deleted posts are skipped and logged. API docs: https://docs.apify.com/api/client/python/ and https://docs.apify.com/api/client/js/. Token: https://console.apify.com/account/integrations.
```

### What is TikTok Slideshow Downloader?

**TikTok Slideshow Downloader** is a TikTok photo downloader for slideshow posts, also called TikTok photo mode or carousel posts. Give it a link such as `https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645` and it **downloads every image in the slideshow**, stores each one as a file in Apify storage, and returns a **direct download link** for each photo together with the post's public metadata.

It works as a lightweight **TikTok slideshow API** alternative: no TikTok account, no login, and no TikTok API key needed. The easiest way to try it is to open the actor, keep the prefilled link, and click **Start**.

### What can TikTok Slideshow Downloader do?

- 🖼️ **Download every slideshow photo** as a real image file, not just a link that expires later.
- 🔗 **Accept any link format**: full `/photo/` links, `vm.tiktok.com` / `vt.tiktok.com` / `tiktok.com/t/` short-share links, `m.tiktok.com/v/{id}.html` links, and plain numeric post IDs.
- 📦 **Process up to 500 posts per run** with a total photo limit (`maxItems`) to control cost.
- 🏷️ **Name files your way** with `{postId}`, `{photoIndex}`, and `{extension}` placeholders.
- 📊 **Add post context** to each photo: caption, author, views, likes, comments, shares, saves, and the post's sound.
- 🧩 **Attach your own data** (`userData`) to any link and get it back on every photo row from that post.
- ⏱️ **Schedule runs** with [Apify schedules](https://docs.apify.com/platform/schedules), call it from the [Apify API](https://docs.apify.com/api/v2), and connect it to [integrations](https://apify.com/integrations) such as Make, Zapier, Google Drive, and webhooks.
- 📁 **Export the photo list** as JSON, CSV, Excel, HTML, or XML from the dataset.

### What data can you extract from TikTok slideshows?

| Field | Description |
|-------|-------------|
| `downloadUrl` | Direct link to the saved image in the run's Apify key-value store |
| `fileName` | Stored file name, built from your `fileNamePattern` |
| `contentType` | Image media type, for example `image/jpeg` |
| `fileSizeBytes` | Saved image size in bytes |
| `imageWidth` / `imageHeight` | Image dimensions in pixels, read from the saved file |
| `photoIndex` / `photoCount` | Position of the photo in the slideshow and total photos in the post |
| `videoId` | TikTok post ID |
| `sourceUrl` | Canonical public TikTok photo-post link |
| `authorUsername` / `authorName` | Creator handle and display name |
| `caption` | Post caption including hashtags |
| `post.playCount`, `post.likeCount`, `post.commentCount`, `post.shareCount`, `post.collectCount` | Public view, like, comment, share, and save counts |
| `audio.id`, `audio.title`, `audio.authorName`, `audio.original`, `audio.durationSeconds` | Sound used in the slideshow |
| `sourceImageUrl` | Original TikTok CDN image link (a signed link that expires, kept for reference) |
| `inputIndex` / `requestedUrl` / `userData` | Which input the photo came from, and your custom data |

### How to download TikTok slideshow photos

1. Open [TikTok Slideshow Downloader](https://apify.com/parsebird/tiktok-slideshow-downloader) and click **Try for free** or **Start**.
2. In **TikTok slideshow links**, add one `{"url": "..."}` item per post. The url can be a photo-post link, a short-share link, or a numeric post ID.
3. Optionally set **Max photos** to cap the total number of photos saved in the run. Leave it empty to download every photo.
4. Optionally change **File name pattern**, for example `{postId}_{photoIndex}.{extension}`.
5. Click **Start** and wait for the run to finish. Small runs take a few seconds.
6. Open the **Output** tab and click any `downloadUrl` to open the image, or export the list as JSON, CSV, or Excel.
7. To get all files at once, open the run's **Storage → Key-value store** tab, or fetch the files through the [key-value store API](https://docs.apify.com/api/v2/key-value-store-record-get).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `slideshowUrls` | array of objects | **Yes** | — | 1 to 500 items. Each item has `url` (photo-post link, short-share link, or numeric post ID) and optional `userData` (any JSON object). Plain strings are also accepted. |
| `slideshowUrls[].url` | string | **Yes** | — | The TikTok reference to process. |
| `slideshowUrls[].userData` | object | No | — | Custom data copied to every photo row from this reference. |
| `maxItems` | integer | No | empty (all photos) | Total number of photos to save across all posts. The form pre-fills `3` for a quick test. |
| `fileNamePattern` | string | No | `{postId}-photo-{photoIndex}.{extension}` | Stored file name. Supports `{postId}`, `{photoIndex}`, `{extension}`. 1–200 characters. Characters other than `A-Z a-z 0-9 ! - _ . ' ( )` become `_`. |
| `proxyConfiguration` | object | No | no proxy | Optional Apify Proxy or custom proxy settings. Not needed for normal runs. |

### Input / Output

Example input:

```json
{
  "slideshowUrls": [
    { "url": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645" },
    { "url": "7553302113757990166", "userData": { "campaign": "hull-city" } }
  ],
  "maxItems": 3,
  "fileNamePattern": "{postId}-photo-{photoIndex}.{extension}"
}
```

Example output (one row per saved photo):

```json
{
  "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.com/tos-maliva-i-photomode-us/4e11f114a249493eb708aa9977d014ca~tplv-photomode-image.jpeg?dr=14555&x-expires=1790766000&x-signature=...",
  "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/<storeId>/records/7498924643227536645-photo-1.jpg?signature=<signature>"
}
```

Some fields can be `null` when TikTok does not publish them for a post. Download the photo list in JSON, CSV, Excel, HTML, or XML from the dataset. The image files themselves live in the run's key-value store.

### Python API example

```python
from apify_client import ApifyClient
import urllib.request

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("parsebird/tiktok-slideshow-downloader").call(run_input={
    "slideshowUrls": [{"url": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645"}],
    "fileNamePattern": "{postId}-photo-{photoIndex}.{extension}",
})

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    urllib.request.urlretrieve(row["downloadUrl"], row["fileName"])
    print("saved", row["fileName"], row["imageWidth"], "x", row["imageHeight"])
```

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';
import { writeFile } from 'node:fs/promises';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('parsebird/tiktok-slideshow-downloader').call({
    slideshowUrls: [{ url: 'https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645' }],
    maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items) {
    const res = await fetch(row.downloadUrl);
    await writeFile(row.fileName, Buffer.from(await res.arrayBuffer()));
}
```

See the official [Python client](https://docs.apify.com/api/client/python/) and [JavaScript client](https://docs.apify.com/api/client/js/) docs for more options.

### Use cases

- **Content archiving**: back up your own or your brand's TikTok slideshows as original image files.
- **Creative and trend research**: collect carousel designs, infographics, and photo dumps for moodboards.
- **Social media reporting**: pair each photo with its view, like, comment, share, and save counts.
- **Repurposing**: move slideshow images to Instagram carousels, Pinterest, or a CMS through integrations.
- **Dataset building**: gather image files with captions and hashtags for labeling or analysis.
- **Monitoring**: re-run on a schedule to track engagement on a fixed set of slideshow posts.

### How it works

1. The actor reads your links, resolves short-share links, and extracts the post ID.
2. It loads the public TikTok post page and reads the slideshow photo list and post details.
3. It downloads each photo, reads its real type, size, and dimensions, and saves it to the run's key-value store under your file name.
4. It pushes one dataset row per photo with a direct `downloadUrl`, stops at your `maxItems` limit, and logs any skipped links with the reason.

### How much does it cost to download TikTok slideshow photos?

**What is the price per TikTok slideshow photo?**

The actor uses pay-per-event pricing. You pay only for photos that are saved; platform usage is included.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `photo-downloaded` | $0.00399 (**$3.99 / 1,000**) | $0.00349 (**$3.49 / 1,000**) | $0.00299 (**$2.99 / 1,000**) | $0.00249 (**$2.49 / 1,000**) |

One `photo-downloaded` event is one photo saved and returned in the dataset. The prefilled 3-photo test costs about $0.012 on the Free plan, and 1,000 photos cost $3.99. Skipped links (videos, private or deleted posts, invalid links) are not charged. Apify's free plan includes monthly platform credits you can use to try the actor.

### Is it legal to download TikTok slideshow photos?

**Is scraping TikTok photo posts legal?**

This actor only accesses publicly available TikTok posts and does not log in or bypass privacy settings. Scraping public data is generally legal in many jurisdictions, but the photos themselves are usually protected by copyright and may contain personal data. Download only what you have a right to use, respect [TikTok's Terms of Service](https://www.tiktok.com/legal/page/us/terms-of-service/en) and creators' rights, and consult your lawyer if unsure. Read more in Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other downloaders and related Actors

| Actor | Best for |
|-------|----------|
| [Pinterest Image Downloader](https://apify.com/parsebird/pinterest-image-downloader) | Image URLs and size variants from Pinterest pins |
| [YouTube Shorts Downloader](https://apify.com/parsebird/youtube-shorts-downloader) | Downloading YouTube Shorts |
| [YouTube Thumbnail Downloader](https://apify.com/parsebird/youtube-thumbnail-downloader) | YouTube thumbnail images |
| [Kick Video Downloader](https://apify.com/parsebird/kick-video-downloader) | Kick clips and VODs |
| [Telegram Media Downloader](https://apify.com/parsebird/telegram-media-downloader) | Media from public Telegram channels |
| [Image Resizer API](https://apify.com/parsebird/image-resizer-api) | Resizing the downloaded photos |

### FAQ

**What is a TikTok slideshow?**
A slideshow (photo mode or carousel) is a TikTok post made of several still photos that viewers swipe through, usually with a sound. Its link contains `/photo/` instead of `/video/`.

**Which link formats are supported?**
Full `tiktok.com/@user/photo/{id}` links (with or without query parameters), `vm.tiktok.com`, `vt.tiktok.com`, and `tiktok.com/t/` short-share links, `m.tiktok.com/v/{id}.html` links, and numeric post IDs.

**Can it download TikTok videos?**
No. Regular video posts are skipped and logged with the reason "regular video post", and you are not charged for them.

**Do I need a TikTok account or API key?**
No. The actor only reads public posts. Private, deleted, and login-only posts are skipped.

**How long do the download links work?**
`downloadUrl` points to the run's Apify key-value store, so it works as long as that storage exists under your plan's [data retention](https://docs.apify.com/platform/storage/usage#data-retention). `sourceImageUrl` is TikTok's signed CDN link and stops working after a while, so use `downloadUrl` for anything you keep.

**Why is there no watermark removal or upscaling?**
The actor saves the photos exactly as TikTok serves them and does not edit images.

**What does `maxItems` count?**
Photos, not posts. With `maxItems: 5` and two 16-photo slideshows, the run saves the first 5 photos and stops.

**Why did a link return no photos?**
The run log lists every skipped link with a reason: a regular video post, a private or deleted post, an expired short link, or a link that is not from TikTok. Open the link in a browser to confirm it is a public photo post.

**Can I schedule runs or use it in automations?**
Yes. Use [schedules](https://docs.apify.com/platform/schedules), the [API](https://docs.apify.com/api/v2), webhooks, or [integrations](https://apify.com/integrations) like Make, Zapier, and Google Drive.

**Where can I report issues or request features?**
Open the **Issues** tab on the actor page with your input and run ID. We usually reply quickly.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/tiktok-slideshow-downloader/changelog.md

# Actor input Schema

## `slideshowUrls` (type: `array`):

Add 1 to 500 items like {"url": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645"}. The url can be a photo-post link, a short-share link (vm.tiktok.com, vt.tiktok.com, tiktok.com/t/), or a numeric post ID such as "7498924643227536645". Add an optional "userData" object to copy your own data into every photo row from that post.

## `maxItems` (type: `integer`):

Stop after saving this many photos in total across all slideshows. Leave empty to save every photo from every post.

## `fileNamePattern` (type: `string`):

Name for each saved image. Use {postId}, {photoIndex}, and {extension}. Characters outside A-Z, a-z, 0-9 and !-\_.'() are replaced with underscores. 1 to 200 characters.

## `proxyConfiguration` (type: `object`):

Optional. Route TikTok requests through Apify Proxy or your own proxies if requests from the default network get blocked.

## Actor input object example

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

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

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

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/tiktok-slideshow-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "slideshowUrls": [{ "url": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645" }],
    "maxItems": 3,
    "fileNamePattern": "{postId}-photo-{photoIndex}.{extension}",
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/tiktok-slideshow-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "slideshowUrls": [
    {
      "url": "https://www.tiktok.com/@anamiriamyepez/photo/7498924643227536645"
    }
  ],
  "maxItems": 3,
  "fileNamePattern": "{postId}-photo-{photoIndex}.{extension}"
}' |
apify call parsebird/tiktok-slideshow-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/tiktok-slideshow-downloader"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yJaHeIKOxgJl929fJ/builds/yP85kpHzlex5ny9Rm/openapi.json
