# GET /v1/tiktok/user/reposts: TikTok reposts API

The videos a TikTok account has reposted, newest repost first, a page at a time: each video's author, caption, cover, file link, and its views and likes. The time is when the author posted the video, as TikTok gives no time for the repost. Comments and shares are null. An empty list when the account has no reposts or hides them. Pass next_cursor back as cursor for the next page.

- Call: `GET https://storiesfly.com/api/v1/tiktok/user/reposts`
- Price **1 request**
- Answers up to **15 minutes** old

## Parameters

All parameters go in the query string.

| Name | Type | Sent | Description |
| --- | --- | --- | --- |
| `username` | string | required | TikTok username, or a profile link. A leading @ is ignored. |
| `cursor` | string | optional | The next_cursor of the page before. Leave it out for the first page. |

## Example request

Put your own key in the header, or in the apiKey option of the npm client.

### cURL

```bash
curl "https://storiesfly.com/api/v1/tiktok/user/reposts?username=khaby.lame" \
  -H "X-Api-Key: sf_live_your_key"
```

### JavaScript

```javascript
const res = await fetch(
  "https://storiesfly.com/api/v1/tiktok/user/reposts?username=khaby.lame",
  { headers: { "X-Api-Key": process.env.STORIESFLY_KEY } }
);
const data = await res.json();
```

### Python

```python
import os
import requests

r = requests.get(
    "https://storiesfly.com/api/v1/tiktok/user/reposts",
    params={"username": "khaby.lame"},
    headers={"X-Api-Key": os.environ["STORIESFLY_KEY"]},
)
data = r.json()
```

## Example response

200 OK · X-Units-Charged: 1

```json
{
  "user": {
    "username": "khaby.lame"
  },
  "videos": [
    {
      "id": "7500000000000000001",
      "url": "https://www.tiktok.com/@maker.1/video/7500000000000000001",
      "author": {
        "username": "maker.1"
      },
      "taken_at": 1790856000,
      "taken_at_iso": "2026-10-01T12:00:00.000Z",
      "caption": "Reposted clip 1 #duet #fun",
      "hashtags": [
        "duet",
        "fun"
      ],
      "media_type": "video",
      "thumbnail_url": "https://p16-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/00000000000000000000000000000011?x-expires=1793000000&x-signature=r1",
      "video_url": "https://v16m-default.tiktokcdn.com/00000000000000000000000000000001/video/tos/alisg/tos-alisg-pve-0037/00000000000000000000000000000001/?mime_type=video_mp4",
      "video_url_sd": null,
      "audio_url": null,
      "images": [],
      "video_duration": 21,
      "views": 1500000,
      "likes": 120000,
      "comments": null,
      "shares": null
    },
    {
      "id": "7500000000000000002",
      "url": "https://www.tiktok.com/@maker.2/photo/7500000000000000002",
      "author": {
        "username": "maker.2"
      },
      "taken_at": 1790942400,
      "taken_at_iso": "2026-10-02T12:00:00.000Z",
      "caption": "Reposted clip 2 #duet #fun",
      "hashtags": [
        "duet",
        "fun"
      ],
      "media_type": "photo",
      "thumbnail_url": "https://p16-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/00000000000000000000000000000022?x-expires=1793000000&x-signature=r2",
      "video_url": null,
      "video_url_sd": null,
      "audio_url": null,
      "images": [
        "https://p16-sign-va.tiktokcdn.com/tos-maliva-i-photo/0000000000000000000000000000000a~tplv-photomode-image.jpeg?x-expires=1793000000&x-signature=p0",
        "https://p16-sign-va.tiktokcdn.com/tos-maliva-i-photo/0000000000000000000000000000000b~tplv-photomode-image.jpeg?x-expires=1793000000&x-signature=p1"
      ],
      "video_duration": null,
      "views": 3000000,
      "likes": 240000,
      "comments": null,
      "shares": null
    }
  ],
  "next_cursor": "c1.ryg6VkAgkE2BcPyGM0q6ADwLG1KAGWvXyxXcleap6rtdnm6USXXD4rRRujLUjticHxS2vixe2jbdlG4LggGvIE1ISp6sYLXI6XWcb66UIrM_RMPDKCUhQylnCgNoMsPrfzM",
  "has_more": true
}
```

A real answer, shortened: lists are cut to two items and long texts to 160 characters.

## Price and freshness

A call takes 1 request. Free requests are spent first, then your balance. The [pricing](https://storiesfly.com/developers/pricing) page has the rates.

Answers are kept for up to 15 minutes. Asking again inside that time returns the same answer and takes 1 request again.

Page size follows TikTok and varies by endpoint.

## Errors

A failed call answers with an HTTP status and a body `{error, code}`. These are the codes this endpoint gives. [Errors and what is charged](https://storiesfly.com/developers/docs#errors) covers all of them.

| Status | Code | When |
| --- | --- | --- |
| `400` | `bad_request` | A parameter is missing or wrong. `fields` lists the names. Free. |
| `401` | `unauthorized` | The `X-Api-Key` header is missing or the key is wrong. Free. |
| `402` | `credits_exhausted` | The free requests and the balance are used up. Top up in the [dashboard](https://storiesfly.com/developers/dashboard). Free. |
| `403` | `telegram_required` | The account behind the key is not linked to Telegram. The answer has a `link_url` to do it. Free. |
| `404` | `not_found` | The account does not exist. Charged like an answer. |
| `429` | `rate_limited` | More requests in a second than your level allows, more than this group can take at once, or more than 1,000 TikTok and download calls today. Wait for the `Retry-After` header. Free. |
| `500` | `internal_error` | A fault on our side. Retry shortly. Refunded. |
| `503` | `upstream_unavailable` | Our side failed or timed out. Retry shortly. Refunded. |

## Questions about this endpoint

### How do I read all the reposts of an account?

Send the `next_cursor` of the answer back as `cursor` for the next page, and stop when `has_more` is `false`. Each page takes 1 request. A cursor works only on the endpoint that returned it.

### Whose video is each item, and what is its time?

Each item is the video of its `author`, the account that made it, not of the account you asked about. `taken_at` is when the author posted the video: TikTok gives no time for the repost itself. The list is in the order of the Reposts tab, newest repost first.

### What if the account has no reposts?

`videos` is an empty list and `next_cursor` is `null`. An account that hides its Reposts tab gives the same answer. It is charged like any answer. Only `views` and `likes` are given for a repost, so `comments` and `shares` are `null`. For all four numbers of one video use [tiktok/video](https://storiesfly.com/developers/docs/tiktok-video).

## Related endpoints

- [GET /v1/tiktok/user/videos](https://storiesfly.com/developers/docs/tiktok-user-videos): A TikTok account's videos with numbers, page by page; file links on page one
- [GET /v1/tiktok/user/profile](https://storiesfly.com/developers/docs/tiktok-user-profile): TikTok profile with followers, following, likes and video count
- [GET /v1/tiktok/video](https://storiesfly.com/developers/docs/tiktok-video): One TikTok video without the watermark, with views, likes, comments and shares
- [GET /v1/download](https://storiesfly.com/developers/docs/download): Files of an Instagram post or reel, or a TikTok video, by link

## Links

- [This page on the site](https://storiesfly.com/developers/docs/tiktok-user-reposts)
- [Instagram data API](https://storiesfly.com/developers): what the API is and what it returns
- [Pricing](https://storiesfly.com/developers/pricing): rates, examples and billing rules
- [Documentation](https://storiesfly.com/developers/docs): quick start, authentication, errors and every endpoint
- [OpenAPI file](https://storiesfly.com/openapi.json): the whole API in one file
- [API dashboard](https://storiesfly.com/developers/dashboard): get a key and top up
- [Changelog](https://storiesfly.com/developers/changelog): what changed and when
