# TikTok Repost Scraper (`maximedupre/tiktok-reposts`) Actor

Collect public reposts from one or more TikTok profiles. Get captions, original creator identity, engagement counts, media and sound links. Add deeper creator details and follower filters when needed.

- **URL**: https://apify.com/maximedupre/tiktok-reposts.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Videos, Marketing
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.55 / 1,000 reposts

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🔁 See what public TikTok profiles repost

This Actor is for social media researchers, marketers, creators, and teams that need to understand what public TikTok profiles choose to repost. It returns one structured row for each retained repost with its caption, original creator identity, engagement counts, media and sound links, and source profile. That makes it easier to compare what accounts amplify and who made it.

- Collect public profile repost rows with [**Tiktok Profile Reposts**](https://apify.com/maximedupre/tiktok-reposts/examples/tiktok-profile-reposts).
- Find reposted videos across submitted profiles with [**Tiktok Repost Finder**](https://apify.com/maximedupre/tiktok-reposts/examples/tiktok-repost-finder).
- Review captions, creators, and engagement for a profile with [**Tiktok Repost Scraper**](https://apify.com/maximedupre/tiktok-reposts/examples/tiktok-repost-scraper).
- Browse a public repost feed with [**Tiktok Anonymous Viewer Repost**](https://apify.com/maximedupre/tiktok-reposts/examples/tiktok-anonymous-viewer-repost).
- View saved public repost data with [**Tiktok Repost Viewer**](https://apify.com/maximedupre/tiktok-reposts/examples/tiktok-repost-viewer).

#### 📋 Repost rows with creator context

**What you get**

Each row keeps the repost, the profile that supplied it, and the original creator together. You can review captions, dates, public engagement counts, video and sound links, hashtags, challenges, tags, and sharing permissions. When deeper creator details are requested, the row can also include a bio, bio link, region, audience counts, and a size tier.

#### ⏱️ Collect from public Reposts tabs

The Actor reads each submitted profile's public Reposts tab and saves an eligible row when it finds one. If the same source item appears again in another submitted profile, the first eligible occurrence is kept and later matches are ignored. `sourceProfile` records the profile that supplied that first row. A smaller `maxItemsPerProfile` can shorten the run. Leave it empty to return all available reposts until the source is exhausted.

#### ⚙️ Input

Add one or more public TikTok profile URLs or handles. The same settings apply to every profile in the run.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `profiles` | Array of strings | Public TikTok profile URLs or handles to read. |
| `maxItemsPerProfile` | Integer | Caps saved reposts for each profile. Leave it empty to return all available reposts until the source is exhausted. |
| `includeOriginalCreatorDetails` | Boolean | Adds deeper public profile fields for the original creator, such as bio, bio link, region, audience counts, content counts, and size tier. |
| `minOriginalCreatorFollowers` | Integer | Keeps reposts only when the original creator has at least this many followers. Leave it empty for no lower bound. |
| `maxOriginalCreatorFollowers` | Integer | Keeps reposts only when the original creator has no more than this many followers. Leave it empty for no upper bound. |

**Successful default input**

This is the public input from a successful run. It leaves `maxItemsPerProfile` empty, so the run can return all available reposts until the source is exhausted.

```json
{
  "profiles": [
    "https://www.tiktok.com/@tiktok"
  ],
  "includeOriginalCreatorDetails": false
}
```

Follower bounds apply to the original creator connected to each repost. Use the lower and upper fields together when you want to focus on a follower range.

#### 🧾 Output

**Run output**

The run output contains a link to the saved dataset.

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | String | Link to the saved TikTok repost rows. |

**Dataset row fields**

Each dataset row has the same shape. Some nested values are present only when TikTok provides them or when deeper creator details are requested.

| Field | Type | What it does |
| --- | --- | --- |
| `repostId` | String | TikTok ID of the reposted video. |
| `caption` | String | Caption shown with the reposted video. |
| `createdAt` | Date-time string | Time when the reposted video was created. |
| `repostUrl` | URL string | Public TikTok URL of the reposted video. |
| `sourceProfile` | String | Submitted profile URL or handle that supplied the first eligible occurrence. |
| `originalCreator` | Object | Public identity and audience details for the original creator when available. |
| `originalCreator.id` | String | TikTok ID of the original creator. |
| `originalCreator.username` | String | Public username of the original creator. |
| `originalCreator.displayName` | String | Public display name of the original creator. |
| `originalCreator.profileUrl` | URL string | Public TikTok profile URL of the original creator. |
| `originalCreator.isVerified` | Boolean | Whether TikTok marks the original creator as verified. |
| `originalCreator.followerCount` | Integer | Public follower count of the original creator. |
| `originalCreator.followingCount` | Integer | Public following count of the original creator. |
| `originalCreator.likeCount` | Integer | Total likes shown for the original creator. |
| `originalCreator.videoCount` | Integer | Number of videos shown for the original creator. |
| `originalCreator.bio` | String | Public bio of the original creator when available. |
| `originalCreator.bioLink` | URL string | Public link shown in the original creator's bio when available. |
| `originalCreator.region` | String | Public region listed for the original creator when available. |
| `originalCreator.sizeTier` | String | Audience size tier for the original creator when available. |
| `engagement` | Object | Public counts for the reposted video. |
| `engagement.playCount` | Integer | Public play count for the reposted video. |
| `engagement.likeCount` | Integer | Public like count for the reposted video. |
| `engagement.commentCount` | Integer | Public comment count for the reposted video. |
| `engagement.shareCount` | Integer | Public share count for the reposted video. |
| `engagement.collectCount` | Integer | Public collection count for the reposted video. |
| `media` | Object | Video details and a source media link. |
| `media.durationSeconds` | Number | Video duration in seconds. |
| `media.width` | Integer | Video width in pixels. |
| `media.height` | Integer | Video height in pixels. |
| `media.quality` | String | Quality label for the video when available. |
| `media.videoUrl` | URL string | Main source video URL for playback or download when available. |
| `media.cover` | Object | Cover image details for the video. |
| `media.cover.url` | URL string | Source URL of the video cover image. |
| `media.cover.width` | Integer | Cover image width in pixels when available. |
| `media.cover.height` | Integer | Cover image height in pixels when available. |
| `music` | Object | Sound details, creator, and source audio links. |
| `music.id` | String | TikTok ID of the sound. |
| `music.title` | String | Public title of the sound when available. |
| `music.creator` | Object | Public creator linked to the sound. |
| `music.creator.id` | String | TikTok ID of the sound creator when available. |
| `music.creator.username` | String | Public username of the sound creator when available. |
| `music.creator.displayName` | String | Public display name of the sound creator when available. |
| `music.creator.profileUrl` | URL string | Public TikTok profile URL of the sound creator when available. |
| `music.durationSeconds` | Number | Sound duration in seconds when available. |
| `music.isOriginal` | Boolean | Whether TikTok marks the sound as original. |
| `music.audioUrl` | URL string | Main source audio URL for playback or download when available. |
| `music.pageUrl` | URL string | Public TikTok page URL for the sound. |
| `hashtags` | Array of strings | Hashtags shown on the reposted video. |
| `challenges` | Array of strings | Challenge labels linked to the reposted video. |
| `tags` | Array of strings | Tag or mention labels linked to the reposted video. |
| `permissions` | Object | Public settings for comments, Duets, and Stitches. |
| `permissions.allowComments` | Boolean | Whether public comments are allowed. |
| `permissions.allowDuet` | Boolean | Whether public Duets are allowed when available. |
| `permissions.allowStitch` | Boolean | Whether public Stitches are allowed when available. |

**Example row from a successful run**

This genuine row came from a successful run with `includeOriginalCreatorDetails` set to `true`. It shows the complete row returned for that item.

```json
{
  "repostId": "7671088500850101534",
  "caption": "AND ITS LIVE ON @TikTok and @iHeartRadio IN 1 HOUR",
  "createdAt": "2026-08-07T01:01:20.000Z",
  "repostUrl": "https://www.tiktok.com/@alexwarren/video/7671088500850101534",
  "sourceProfile": "https://www.tiktok.com/@tiktok",
  "originalCreator": {
    "id": "292342703596507136",
    "username": "alexwarren",
    "displayName": "Alex Warren",
    "profileUrl": "https://www.tiktok.com/@alexwarren",
    "isVerified": true,
    "followerCount": 21200000,
    "followingCount": 5003,
    "likeCount": 1200000000,
    "videoCount": 1272,
    "sizeTier": "mega",
    "bio": "MY ALBUM WILDCHILD AUGUST 28TH"
  },
  "engagement": {
    "playCount": 1500000,
    "likeCount": 132200,
    "commentCount": 1747,
    "shareCount": 1614,
    "collectCount": 6344
  },
  "media": {
    "durationSeconds": 9,
    "width": 720,
    "height": 1280,
    "quality": "720p",
    "videoUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-pve-0068-tx2/owIzwIA1LO1LYiOxyl9BmAQCqwifAHABGECKip/?a=1988&bti=ODszNWYuMDE6&&bt=1747&ft=4KJMyMzm8Zmo0z42Ha4jVqMuQpWrKsd.&mime_type=video_mp4&rc=Zzk1NztpZDM0NztmZTk8aUBpampyNWw5cjZsPDMzaTczNEBeNmFfMV5iNjExNTVgLjFhYSNmcWQtMmRzbG5hLS1kMTJzcw%3D%3D&expire=1787793942&l=202608250125335FA166A75676321BC0E6&ply_type=2&policy=2&signature=17a951026cd91a2b48eb219dd969b0b3&tk=tt_chain_token&btag=e000b0000",
    "cover": {
      "url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oIDZ1lfyAV6lUFAIpn4EAeqQE6IILEeAjIBA66~tplv-tiktokx-origin.image?dr=9636&x-expires=1787792400&x-signature=B1XFyVbYLxtZfKIFWX%2B5pQv5sRQ%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast8"
    }
  },
  "music": {
    "id": "7667300537578801950",
    "title": "RESCUER BRIDGE",
    "creator": {
      "username": "Alex Warren",
      "displayName": "Alex Warren"
    },
    "durationSeconds": 18,
    "isOriginal": true,
    "audioUrl": "https://v16m.tiktokcdn-us.com/ae1da866e161a66efd5e77b78a5b0cd5/6a8d437f/video/tos/useast8/tos-useast8-v-27dcd7-tx2/ooBzqETEG9kK3CuuAIeUEmAAfLzfAUIoatYTVn/?a=1233&bti=ODszNWYuMDE6&&bt=125&ft=GSDrKInz7ThEXBkGXq8Zmo&mime_type=audio_mpeg&rc=M2h1aXU5cmx1PDMzaTU8NEBpM2h1aXU5cmx1PDMzaTU8NEBgc3NiMmRjZmdhLS1kMTJzYSNgc3NiMmRjZmdhLS1kMTJzcw%3D%3D&vvpl=1&l=202608250125335FA166A75676321BC0E6&btag=e00078000",
    "pageUrl": "https://www.tiktok.com/music/sound-7667300537578801950"
  },
  "hashtags": [],
  "challenges": [],
  "tags": [
    "tiktok",
    "iheartradio"
  ],
  "permissions": {
    "allowComments": true,
    "allowDuet": true,
    "allowStitch": true
  }
}
```

#### 💳 Pricing

**Charged event**

Each saved public repost is one charged event. See the Pricing tab for the current rate. A smaller `maxItemsPerProfile` can reduce the number of saved repost events. Leaving it empty returns all available reposts until the source is exhausted.

#### 🔌 Integrations

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

Use the dataset link in the run output to review or export the saved rows. The public data can also be read through the Apify run and dataset tools.

#### ❓ FAQ

##### What does a repost row represent?

It is a public video shown in a submitted profile's Reposts tab. The `originalCreator` fields describe the creator of that video, while `sourceProfile` identifies the profile that supplied the first saved occurrence.

##### What happens if the same repost appears in more than one profile?

The first eligible occurrence is saved. Later matches are ignored, and the row keeps the first `sourceProfile`.

##### Can I use more than one profile?

Yes. Add one or more public profile URLs or handles. The same settings apply to all profiles in the run.

##### What does an empty maxItemsPerProfile do?

It returns all available reposts until the source is exhausted. Set a value when you want a shorter run or fewer rows to review.

##### What does includeOriginalCreatorDetails add?

It asks for deeper public fields such as the original creator's bio, bio link, region, audience counts, content count, and size tier when available.

##### Can I filter by the original creator's follower count?

Yes. Set a minimum, a maximum, or both. The Actor keeps reposts whose original creator meets those bounds.

##### Why did a profile return fewer rows than I expected?

The public Reposts tab may expose fewer items at run time. Follower bounds can also remove rows, and repeated matches are ignored after the first eligible occurrence.

##### Does this collect private profiles or unrelated TikTok data?

No. It reads public repost content from the profiles you submit. It does not perform global TikTok search or collect private content, comments, messages, or account analytics.

##### Does the Actor save media files?

No. It returns available source media and sound links with their metadata. It does not store the media files themselves.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-reposts/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [TikTok Profile Mention Scraper](https://apify.com/maximedupre/tiktok-profile-mention-scraper) finds public videos that mention a profile handle so you can compare mentions with repost activity.
- [TikTok Search Scraper](https://apify.com/maximedupre/tiktok-search-results-scraper) searches public videos or creator profiles by keyword for wider TikTok context.
- [TikTok Repost Scraper: Original Creator Data & Filters](https://apify.com/scrapeflow/tiktok-repost-scraper) provides another public repost view with original creator details and follower filters.
- [Tiktok Repost Scraper](https://apify.com/scraperforge/tiktok-repost-scraper) collects another view of a public profile's Reposts tab with raw video, sound, and media fields.
- [TikTok Repost Scraper](https://apify.com/scrapepilotapi/tiktok-repost-scraper) gives a separate public repost feed for review and comparison.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter one or more public TikTok profile URLs or handles. The Actor uses each profile's public Reposts tab and applies the same settings to all profiles.

## `maxItemsPerProfile` (type: `integer`):

Stop after this many reposts from each profile. Leave it empty to return all available reposts until the public Reposts tab is exhausted.

## `includeOriginalCreatorDetails` (type: `boolean`):

Turn this on to add deeper public profile data for original creators, such as their bio, link, region, audience counts, content counts, and size tier.

## `minOriginalCreatorFollowers` (type: `integer`):

Keep reposts only when the original creator has at least this many followers. Leave it empty to set no lower bound.

## `maxOriginalCreatorFollowers` (type: `integer`):

Keep reposts only when the original creator has no more than this many followers. Leave it empty to set no upper bound.

## Actor input object example

```json
{
  "profiles": [
    "https://www.tiktok.com/@tiktok"
  ],
  "maxItemsPerProfile": 10,
  "includeOriginalCreatorDetails": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

A link to the saved TikTok repost rows.

# 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 = {
    "profiles": [
        "https://www.tiktok.com/@tiktok"
    ],
    "maxItemsPerProfile": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/tiktok-reposts").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 = {
    "profiles": ["https://www.tiktok.com/@tiktok"],
    "maxItemsPerProfile": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/tiktok-reposts").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 '{
  "profiles": [
    "https://www.tiktok.com/@tiktok"
  ],
  "maxItemsPerProfile": 10
}' |
apify call maximedupre/tiktok-reposts --silent --output-dataset

```

## MCP server setup

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

```

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/mD5JbrHlp8huZOtVr/builds/Qvdtk3gEpxQyt74Cj/openapi.json
