# TikTok Thumbnail Downloader - Full-Size Video Covers (`seemuapps/tiktok-thumbnail-downloader`) Actor

Download TikTok video thumbnails in full resolution (up to 1080x1920), plus animated covers and creator avatars. Paste video links or usernames.

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

## Pricing

from $15.00 / 1,000 thumbnails

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Thumbnail Downloader - Full-Size Video Covers

Download TikTok video thumbnails in the highest resolution TikTok has - up to 1080x1920 - plus the animated hover cover, the original first-frame cover and the creator's profile picture. Paste video links or usernames and get permanent download links in bulk. No login, no browser extension, no watermark.

### What you get

- **Full-size cover thumbnail** for every video, as a JPEG (most covers are 720x1280 to 1080x1920)
- **Animated cover** (optional) - the moving preview TikTok plays on hover, as an animated WebP
- **Original cover** (optional) - the first frame of the video, before the creator picked a custom cover
- **Creator avatar** (optional) - the profile picture in the largest size available (up to 1080x1080), saved once per creator
- Real **width, height, format and file size** of every image, read from the file itself
- **Permanent download links**: every image is saved to the run's storage, because TikTok's own image links expire within days
- Video details on every row: video ID, link, caption, creator, post date, views, likes, comments, shares and saves
- Works for **video links, photo slideshow posts and whole profiles** (the latest N videos)
- Export to JSON, CSV, Excel or Google Sheets from the Apify console, or pull results through the API

### Use cases

- **Content research and competitor analysis** - collect the covers of top-performing videos in your niche
- **Thumbnail design inspiration** - build mood boards and swipe files from creators you admire
- **Creator and influencer vetting** - archive a creator's recent covers and avatar for a pitch deck or media kit
- **Social media reporting** - drop real cover images into client reports and dashboards
- **Dataset building** - gather labelled cover images for computer vision, classification or recommendation models

### How to use

1. Paste TikTok video links into **TikTok video links** (`tiktok.com/@user/video/...`, `tiktok.com/@user/photo/...`, `vm.tiktok.com/...` short links, or bare video IDs) - and/or add usernames to **Profiles**
2. For profiles, set **Max videos per profile** (default 10)
3. Choose which images you want: **Cover thumbnail** (on by default), **Animated cover**, **Original cover**, **Creator avatar**
4. Pick a **Preferred image format** - JPEG opens everywhere, WebP is smaller
5. Run the actor. Images appear in the **Key-value store** tab, and one row per video appears in the **Dataset** tab with a link to each file

Turn off **Save image files** if you only want TikTok's own image links (they expire after a few days, so download them quickly).

### Output format

One dataset row per video:

```json
{
  "inputUrl": "https://www.tiktok.com/@khaby.lame/video/7697307919943060767",
  "profile": null,
  "status": "ok",
  "message": null,
  "videoId": "7697307919943060767",
  "url": "https://www.tiktok.com/@khaby.lame/video/7697307919943060767",
  "contentType": "video",
  "author": "khaby.lame",
  "authorName": "Khabane lame",
  "description": "I guess is time to retire #learnfromkhaby #comedy",
  "createTime": "2026-10-16T16:46:21.000Z",
  "views": 3300000,
  "likes": 272900,
  "comments": 6513,
  "shares": 31500,
  "saves": 14618,
  "coverUrl": "https://p19-common-sign.tiktokcdn-us.com/...~tplv-tiktokx-origin.image?...",
  "dynamicCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/...",
  "originCoverUrl": "https://p19-common-sign.tiktokcdn-us.com/...",
  "avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/...",
  "cdnLinksExpireAt": "2026-10-22T23:00:00.000Z",
  "coverFileUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/khaby.lame-7697307919943060767-cover.jpg",
  "dynamicCoverFileUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/khaby.lame-7697307919943060767-dynamicCover.webp",
  "originCoverFileUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/khaby.lame-7697307919943060767-originCover.jpg",
  "avatarFileUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/khaby.lame-avatar.jpg",
  "width": 1080,
  "height": 1920,
  "coverBytes": 206545,
  "images": [
    {
      "kind": "cover",
      "sourceUrl": "https://p19-common-sign.tiktokcdn-us.com/...",
      "fileUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/khaby.lame-7697307919943060767-cover.jpg",
      "fileKey": "khaby.lame-7697307919943060767-cover.jpg",
      "format": "jpeg",
      "width": 1080,
      "height": 1920,
      "bytes": 206545,
      "animated": false
    }
  ],
  "downloadedAt": "2026-10-20T23:50:56.867Z"
}
```

- `coverFileUrl`, `dynamicCoverFileUrl`, `originCoverFileUrl` and `avatarFileUrl` are permanent public download links
- `coverUrl` and the other `...Url` fields are TikTok's own links, which stop working at `cdnLinksExpireAt`
- `images` lists every saved image with its real pixel size, format, file size and whether it is animated
- `status` is `ok`, `partial` (some requested images don't exist for that post, explained in `message`), `not_found`, `invalid_input`, `error` or `not_processed`

### Pricing

Pay only for results:

- **$0.015 per video** with at least one image delivered ($15 per 1,000 videos). Every image type you turn on is included in that price.
- **$0.015 per profile** that returns videos (covers looking up the profile and listing its videos).

Rows with status `not_found`, `invalid_input`, `error` or `not_processed` are never charged. Example: 2 profiles x 50 videos = 2 x $0.015 + 100 x $0.015 = $1.53.

### Notes & limits

- **Resolution depends on the upload.** TikTok stores covers at the size the video was posted in, so some covers are 720x1280 or 1048x1518 rather than 1080x1920.
- **Not every video has an animated cover.** Videos with a custom cover, and all photo slideshows, usually have none - the row says so in `message`.
- **Photo slideshows** return the slideshow's cover image. To download every photo in a slideshow, use a TikTok slideshow downloader.
- **Profiles** return the most recent videos; pinned videos can appear first even if they are older.
- **Private, deleted and region-locked videos** can't be read and come back as `not_found`.
- Up to 500 video links and 500 videos per profile per run.
- Only download content you have the right to use, and respect creators' copyright.

# Actor input Schema

## `videoUrls` (type: `array`):

TikTok video or photo post URLs (tiktok.com/@user/video/..., vm.tiktok.com short links) or video IDs, one per line (up to 500 per run).

## `profiles` (type: `array`):

TikTok usernames (with or without @) or profile links. The latest videos from each profile are downloaded.

## `maxVideosPerProfile` (type: `integer`):

How many of each profile's most recent videos to download thumbnails for (1-500).

## `includeCover` (type: `boolean`):

Download the video's cover image in the highest resolution TikTok has (up to 1080x1920).

## `includeDynamicCover` (type: `boolean`):

Also download the animated preview cover TikTok shows on hover, as an animated WebP. Photo posts don't have one.

## `includeOriginCover` (type: `boolean`):

Also download the original first-frame cover (the frame before any custom cover was chosen).

## `includeAvatar` (type: `boolean`):

Also download the creator's profile picture in the largest size available (up to 1080x1080). Saved once per creator per run.

## `imageFormat` (type: `string`):

Which format to pick when TikTok offers more than one. JPEG opens everywhere; WebP files are smaller. Full-size covers are usually only offered as JPEG, and animated covers are always WebP.

## `downloadFiles` (type: `boolean`):

Save every image to the run's storage with a permanent download link. Turn off to only get TikTok's own image links, which expire after a few days.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@khaby.lame/video/7697307919943060767"
  ],
  "maxVideosPerProfile": 10,
  "includeCover": true,
  "includeDynamicCover": false,
  "includeOriginCover": false,
  "includeAvatar": false,
  "imageFormat": "jpeg",
  "downloadFiles": true
}
```

# Actor output Schema

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

One row per video: coverFileUrl, dynamicCoverFileUrl, originCoverFileUrl, avatarFileUrl, width, height, coverBytes, the original TikTok image links, and the video's caption, creator, date and engagement counts.

## `files` (type: `string`):

All image files saved in this run's key-value store.

# 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 = {
    "videoUrls": [
        "https://www.tiktok.com/@khaby.lame/video/7697307919943060767"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/tiktok-thumbnail-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 = { "videoUrls": ["https://www.tiktok.com/@khaby.lame/video/7697307919943060767"] }

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/tiktok-thumbnail-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 '{
  "videoUrls": [
    "https://www.tiktok.com/@khaby.lame/video/7697307919943060767"
  ]
}' |
apify call seemuapps/tiktok-thumbnail-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seemuapps/tiktok-thumbnail-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/vP9tPWWnDmECGDQz7/builds/Gl3fb2ZjGFHDsffNu/openapi.json
