# TikTok Reposts Export: Videos Any Account Reposted, No Login (`neverempty/tiktok-reposts-export`) Actor

See what any TikTok account reposted: every reposted video with its original creator, views, likes, comments, shares, saves, caption, sound and post time, in repost order. No login, no cookies. Many accounts per run. Export to CSV, Excel or JSON.

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

## Pricing

from $2.00 / 1,000 repost returneds

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 Reposts Export: Videos Any Account Reposted, No Login

**See what any TikTok account reposted: this Actor exports the videos in an account's Reposts list to CSV, Excel or JSON, with no login, no cookies and no TikTok API key.** Each repost is one flat row with the original creator, views, likes, comments, shares, saves, caption, hashtags, sound and post time, in the order TikTok lists the reposts.

On 2026-10-21 it exported the whole repost list of @duolingo, 1,046 reposts, in 59 seconds. 100 reposts of the same account took about 6 seconds.

- **The original creator on every row**: username, nickname, follower count and verified badge of the person who posted the video, next to the account that reposted it.
- **The whole repost list or just the latest ones.** Up to 10,000 reposts per account with `maxRepostsPerProfile`, and up to 200 accounts in one run.
- **Usernames, profile URLs or secUids.** `duolingo`, `@duolingo`, `https://www.tiktok.com/@duolingo` and a secUid all work, and a renamed account is flagged on every row with `repostedByMatchesInput`.
- **Photo posts are included** with their number of images, and marked with `postType: "photo"`.
- **Fewer rows come with the reason.** When an account does not exist, is private, has no public reposts, or reading stopped part way, a free row says why. These rows are never charged.
- **$3.50 per 1,000 reposts, down to $2.00 on paid Apify plans.** No start fee.

Unofficial and not affiliated with TikTok. It reads only what TikTok shows to any visitor without logging in: no private accounts, no direct messages, nothing behind a login.

### What people use it for

- **Influencer vetting**: see what a creator chooses to repost, which brands and creators they push to their followers, and whether those videos are ads.
- **Brand and campaign tracking**: find out which creators and fan accounts reposted your videos, or which videos a brand account reposts from its community.
- **Competitor research**: export what a competitor's account reposts and see which creators they work with, with each video's views, likes and shares.
- **Creator discovery**: the accounts a big account reposts are often the creators it works with. Every row has the original creator's username and follower count.
- **Data for AI and analytics pipelines**: one clean JSON row per repost, numbers as plain integers (152900, not "152.9K").

### How to export the reposts of a TikTok account

1. Put the accounts in `profiles`: `duolingo`, `@duolingo`, the profile URL or a secUid, one per line.
2. Set `maxRepostsPerProfile` (100 by default, up to 10,000). Reposts come in the order the account's Reposts list shows them, so a low number gives the first ones listed.
3. Click **Start**.
4. Download the dataset as CSV, Excel or JSON, or call the Actor from the Apify API, Python or Node.js and read the rows as JSON.

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `profiles` | none | Usernames, profile URLs or secUids, one per line (commas and spaces also separate entries). Up to 200 per run. |
| `maxRepostsPerProfile` | `100` | Stop each account after this many reposts. Up to 10,000. If the account's list ends earlier, you get all of them. |
| `useProxy` | `true` | Retry through a US proxy only if TikTok answers with a rate limit or an empty response. Off = no proxy is used or paid for. |

```json
{
    "profiles": ["duolingo", "https://www.tiktok.com/@khaby.lame"],
    "maxRepostsPerProfile": 500
}
```

If you leave `profiles` out, the example in the input form is read (@duolingo) and the run log says so. An empty list is rejected with a free `invalid-input` row.

### Output

One row per reposted video or photo post. This row was read from Apify on 2026-10-21 (UTC) with the example input:

```json
{
    "status": "ok",
    "inputProfile": "https://www.tiktok.com/@duolingo",
    "repostedBy": "duolingo",
    "repostedByMatchesInput": true,
    "repostedByNickname": "Duolingo",
    "repostedByFollowerCount": 18271329,
    "repostPosition": 1,
    "videoId": "7696918037928201486",
    "videoUrl": "https://www.tiktok.com/@iconikki/video/7696918037928201486",
    "postType": "video",
    "description": "👀 so do we ll know this person or are you this person.. 😭 the chokehold be so tight #duolingo #funny #skit #relatable #spanish @Duolingo @☆Emy☆ @princessajoi",
    "language": "en",
    "createdAt": "2026-10-15T15:33:15.000Z",
    "createTime": 1792078395,
    "authorUsername": "iconikki",
    "authorId": "53624125109338112",
    "authorNickname": "nikki 🇳🇬",
    "authorVerified": false,
    "authorFollowerCount": 102700,
    "isOwnVideo": false,
    "playCount": 152900,
    "likeCount": 33300,
    "commentCount": 213,
    "shareCount": 1537,
    "saveCount": 1109,
    "countsMayBeRounded": true,
    "durationSeconds": 51,
    "videoWidth": 720,
    "videoHeight": 1280,
    "coverUrl": "https://p16-common-sign.tiktokcdn-us.com/...",
    "musicId": "6997838557607888898",
    "musicTitle": "Creepy and simple horror background music(1070744)",
    "musicAuthor": "howlingindicator",
    "musicIsOriginal": false,
    "hashtags": ["duolingo", "funny", "skit", "relatable", "spanish"],
    "mentions": ["duolingo", "thatdivaemy", "princessajoi"],
    "isAd": false,
    "locationName": "Atlanta",
    "locationCity": null
}
```

Every row also has `source`, `scrapedAt`, `repostedBySecUid`, `authorSecUid`, `imageCount` and `photoTitle`. Notes on the columns:

- `repostPosition` is the place in the account's Reposts list, 1 being the first one listed. TikTok does not say when a video was reposted, so there is no repost time; `createdAt` is when the original video was posted.
- `repostedBy...` columns describe the account you asked for; `author...` columns describe the creator of the reposted video.
- **Counts are plain integers exactly as TikTok publishes them.** TikTok itself rounds views, likes, comments and shares of 10,000 and more (152,900, 33,300); `countsMayBeRounded` is `true` on those rows. `saveCount` is not rounded by TikTok.
- `postType` is `photo` for photo posts: they have `imageCount` and `photoTitle`, and no duration. In the runs on 2026-10-21, 113 of 2,355 reposts were photo posts.
- `isAd` is TikTok's own ad flag on the video (193 of the same 2,355 reposts carried it).
- `isOwnVideo` is `true` when the account reposted one of its own videos (none of the 2,355 did).
- `mentions` are the usernames of the accounts tagged in the caption.
- `coverUrl` is a signed TikTok image link that expires after a few days; download the image if you need to keep it.
- Location fields are filled only when the creator tagged a place.

### FAQ

**How can I see what someone reposted on TikTok?**
Put their username or profile URL in `profiles` and click Start. Each reposted video comes back as one row with its original creator, views, likes, comments, shares and saves, in the order TikTok lists the reposts. Export the dataset as CSV, Excel or JSON.

**Can I export TikTok reposts without logging in or a TikTok API key?**
Yes. The Actor reads only what TikTok shows to any visitor, with no login, no cookies and no TikTok API key. You can run it from the Apify Console or call it like an API from the Apify API, Python or Node.js and get JSON back.

**How do I export all reposts of a TikTok account to CSV?**
Set `maxRepostsPerProfile` high enough (up to 10,000) and download the dataset as CSV. On 2026-10-21 the whole repost list of @duolingo, 1,046 reposts, came back in 59 seconds.

**Does it show when a video was reposted?**
No. TikTok does not publish the time of a repost. Rows come in the order of the account's Reposts list, and `repostPosition` keeps that order. `createdAt` is when the original video was posted.

**Why did an account return no reposts?**
The account has not reposted anything, does not show its reposts publicly, is private or does not exist. A free row says what TikTok answered (no such profile, a private account or an empty repost list), so you never pay for reposts that are not there.

**How much does it cost to export TikTok reposts?**
$3.50 per 1,000 reposts on the Apify Free plan, down to $2.00 per 1,000 on paid plans, with no start fee. Rows that explain a missing or empty result are free.

### Rows that are never charged

| Status | Meaning |
| --- | --- |
| `no-such-profile` | TikTok returned no profile for the username (code 10221). |
| `private-account` | The account is private, so its reposts were not requested. |
| `list-refused` | TikTok refused the account's repost list (code 10201). |
| `no-reposts-listed` | TikTok listed no reposts for the account. |
| `max-reposts-reached` | The account reached `maxRepostsPerProfile`; TikTok may list more. |
| `stopped-reading` | Reading stopped part way (a later page could not be read). The rows returned before that are complete. |
| `verification-page` | TikTok showed a verification page (a check that the visitor is a person). The Actor does not try to get past it; the run stops there. |
| `blocked` | TikTok refused or kept answering with a rate limit or an empty response. |
| `unreadable` | The page could not be read (`tiktokStatusCode` has TikTok's code when it gave one). |
| `invalid-input` / `duplicate` | The entry could not be read, or it is the same account as an earlier entry. |
| `budget-reached` / `not-checked` | The run's maximum total charge had no room for more, or the list was longer than one run takes. |

### Pricing

- **$3.50 per 1,000 reposts** returned on the Apify Free plan, down to $2.00 per 1,000 on paid plans, charged only for rows with `status: "ok"`. No start fee.
- The Actor reads only as many pages as the run's maximum total charge can pay for, and a free row says what was left out.
- If Apify restarts a run, the reposts already in the dataset are not returned or charged again.

### Good to know

- Unofficial. Public data only. This Actor is not affiliated with TikTok.
- The rows are the repost list TikTok shows to a visitor who is not logged in. It can differ from what you see in the app while logged in.
- Counts are read at the moment of the run and can differ slightly between two requests made at the same time, as TikTok's own counters do.
- The Actor does not download video files, read comments or follow short links (`vm.tiktok.com`); open a short link in a browser and paste the profile URL.
- If TikTok shows a verification page, the run stops there and the rows returned before it are complete.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

Accounts to list the reposts of: a username (duolingo or @duolingo), a profile URL (https://www.tiktok.com/@duolingo) or a secUid (MS4wLjABAAAA...). One per line (commas and spaces also separate entries), up to 200 per run. Short links (vm.tiktok.com) are not followed: open one in a browser and paste the profile URL.

## `maxRepostsPerProfile` (type: `integer`):

Reading an account stops once this many charged repost rows have been returned for it, and a free row says so. Reposts come in the order the account's Reposts tab lists them, so a low number gives the first ones listed. If the account's repost list ends earlier, you get all of them.

## `useProxy` (type: `boolean`):

Every page is requested directly first. Only a rate limit (HTTP 429 or 503), an empty response or no response is retried through a US proxy. A verification page is never retried: the run stops there. Off = no proxy is used or paid for.

## Actor input object example

```json
{
  "profiles": [
    "https://www.tiktok.com/@duolingo"
  ],
  "maxRepostsPerProfile": 20,
  "useProxy": true
}
```

# Actor output Schema

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

One row per video (or photo post) that each TikTok account reposted, in the order TikTok lists the reposts: the reposting account, the position in its repost list, the video id and URL, the original creator with follower count and verified badge, the caption, the time the video was posted, the view, like, comment, share and save counts, the length, the sound and the hashtags. Accounts that do not exist, private accounts, accounts with no public reposts, verification pages and invalid input come back as free rows that say why.

# 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/@duolingo"
    ],
    "maxRepostsPerProfile": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/tiktok-reposts-export").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/@duolingo"],
    "maxRepostsPerProfile": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/tiktok-reposts-export").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/@duolingo"
  ],
  "maxRepostsPerProfile": 20
}' |
apify call neverempty/tiktok-reposts-export --silent --output-dataset

```

## MCP server setup

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

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/XPV2cxYDsGuhCWfzD/builds/xybKcSmk8HeMRLwLB/openapi.json
