# List a TikTok user's recent videos

Returns a TikTok user's recent videos, with engagement counts, a page at a time. Use it to follow an account's content.

Tool `tiktok.user.videos` on TikTok. Contract version 1, released 2026-10-27.

## Example call

Over REST, send the input in the body. Over MCP, pass the same input to `call_tool`.

cURL:

```bash
curl https://api.voxoria.ai/v1/tools/tiktok.user.videos/calls \
  -H "Authorization: Bearer $VOXORIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"sec_uid":"MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM"}}'
```

Python:

```python
import os

import httpx

response = httpx.post(
    "https://api.voxoria.ai/v1/tools/tiktok.user.videos/calls",
    headers={"Authorization": f"Bearer {os.environ['VOXORIA_API_KEY']}"},
    json={
        "input": {
            "sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
        },
    },
    timeout=60,
)
print(response.json())
```

TypeScript:

```ts
const response = await fetch("https://api.voxoria.ai/v1/tools/tiktok.user.videos/calls", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VOXORIA_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "input": {
      "sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
    },
  }),
});
console.log(await response.json());
```

MCP (`tools/call` params):

```json
{
  "name": "call_tool",
  "arguments": {
    "tool": "tiktok.user.videos",
    "input": {
      "sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM"
    }
  }
}
```

Both return [the full response](/docs/call-response.md): the call's ID, status and cost, with this tool's result in `output`.

## Input

| Input | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `sec_uid` | string | Yes |  | TikTok's secure identifier of the user. Take it from user.sec_uid of tiktok.user.profile, or author_sec_uid of a video. |
| `next_page_token` | string | No |  | Fetches the next page. Take it from pagination.next_page_token of the previous page, and send the same sec_uid. |

## Output

A successful call returns these blocks in its `output`. A field not marked required can be `null`.

### videos

A list of rows. Always present, possibly empty.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | Yes | TikTok's numeric identifier of the video, as a string. The video is at https://www.tiktok.com/@<author_username>/video/ followed by it. |
| `url` | string | No | Address of the video on tiktok.com. |
| `text` | string | No | The video's caption, hashtags and mentions included. |
| `published_at` | string | No | When the video was published, in ISO 8601. |
| `duration_ms` | integer | No | Length of the video, in milliseconds. |
| `width` | integer | No | Width of the video, in pixels. |
| `height` | integer | No | Height of the video, in pixels. |
| `preview_image_url` | string | No | Address of the video's cover image. TikTok's media addresses expire. |
| `author_id` | string | No | TikTok's numeric identifier of the author, as a string. |
| `author_sec_uid` | string | No | TikTok's secure identifier of the author, which tiktok.user.videos takes as sec_uid. |
| `author_username` | string | No | The author's handle, without the @. |
| `author_name` | string | No | The author's display name. |
| `author_image_url` | string | No | Address of the author's profile picture. |
| `author_verified` | boolean | No | Whether TikTok marks the author as verified. |
| `author_follower_count` | integer | No |  |
| `view_count` | integer | No | Number of times the video was played. |
| `like_count` | integer | No |  |
| `comment_count` | integer | No |  |
| `share_count` | integer | No |  |
| `bookmark_count` | integer | No | Number of times the video was saved to favorites. |
| `approx_author_follower_count` | integer | No | Number of the author's followers, approximate, rounded by the source (28.8M is 28800000). |
| `approx_view_count` | integer | No | Number of times the video was played, approximate, rounded by the source (33.3M is 33300000). |
| `approx_like_count` | integer | No | Number of likes, approximate, rounded by the source (2.1M is 2100000). |
| `approx_comment_count` | integer | No | Number of comments, approximate, rounded by the source (12.5K is 12500). |
| `approx_share_count` | integer | No | Number of shares, approximate, rounded by the source (12.5K is 12500). |
| `approx_bookmark_count` | integer | No | Number of times the video was saved to favorites, approximate, rounded by the source (90.6K is 90600). |
| `hashtags` | array of string | No | Each hashtag in the caption, without the |
| `mentioned_usernames` | array of string | No | Handle of each account the caption mentions, without the @. |
| `music_id` | string | No | TikTok's identifier of the video's sound. |
| `music_title` | string | No | Title of the video's sound. |
| `music_author_name` | string | No | Name of the artist or account the sound is credited to. |

### pagination

One object. Can be `null`. How to fetch the next page. Null on the last page.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `next_page_token` | string | Yes | Send as next_page_token to fetch the next page. |

## Example output

The `output` of a real call, each list cut to 3 items.

```json
{
  "videos": [
    {
      "id": "7700680369246358815",
      "url": null,
      "text": "TikTok asked. @Aston Martin Aramco F1 Team answered. 🏎️🏁 @allena holzworth goes behind the scenes in the garage at Austin for Search Files. 🔎",
      "published_at": "2026-10-25T18:53:00Z",
      "duration_ms": 74000,
      "width": 720,
      "height": 1280,
      "preview_image_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ooAASpEQIEAqKN3fpUFVeCGcWAA42EAIDClRAk~tplv-tiktokx-origin.image?dr=9636&x-expires=1793332800&x-signature=EGh7shjDWL51NNsf6jJYVk2tQ08%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
      "author_id": "107955",
      "author_sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
      "author_username": "tiktok",
      "author_name": "TikTok",
      "author_image_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=bc102787&x-expires=1793332800&x-signature=YvpYWckR5tK8e%2FLw1saOLbSfOoM%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
      "author_verified": true,
      "author_follower_count": null,
      "view_count": null,
      "like_count": null,
      "comment_count": null,
      "share_count": null,
      "bookmark_count": null,
      "approx_author_follower_count": 96500000,
      "approx_view_count": 314800,
      "approx_like_count": 3462,
      "approx_comment_count": 1410,
      "approx_share_count": 341,
      "approx_bookmark_count": 315,
      "hashtags": null,
      "mentioned_usernames": [
        "astonmartinf1",
        "allenaholzworth"
      ],
      "music_id": "7700680397922814751",
      "music_title": "original sound",
      "music_author_name": "TikTok"
    },
    {
      "id": "7700009319382650142",
      "url": null,
      "text": "The best part of searching a new city on TikTok? Discovering the people who give it flavour. 🍵 Racing car driver Jak Crawford 🏎️🏁 meets the team behind @mori in Austin this race weekend.",
      "published_at": "2026-10-23T23:29:02Z",
      "duration_ms": 107000,
      "width": 720,
      "height": 1280,
      "preview_image_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/okBlwDRE5btvzvAEVAii9AbaOEI9PktAuBA37~tplv-tiktokx-origin.image?dr=9636&x-expires=1793332800&x-signature=J6M2fnwtlizf5uLUWjDwOow9mmM%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
      "author_id": "107955",
      "author_sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
      "author_username": "tiktok",
      "author_name": "TikTok",
      "author_image_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=bc102787&x-expires=1793332800&x-signature=YvpYWckR5tK8e%2FLw1saOLbSfOoM%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
      "author_verified": true,
      "author_follower_count": null,
      "view_count": null,
      "like_count": null,
      "comment_count": null,
      "share_count": null,
      "bookmark_count": null,
      "approx_author_follower_count": 96500000,
      "approx_view_count": 309500,
      "approx_like_count": 5552,
      "approx_comment_count": 1456,
      "approx_share_count": 450,
      "approx_bookmark_count": 437,
      "hashtags": null,
      "mentioned_usernames": [
        "morimatcha__"
      ],
      "music_id": "7700009421400869662",
      "music_title": "original sound",
      "music_author_name": "TikTok"
    },
    {
      "id": "7698770783367171359",
      "url": null,
      "text": "The throwback sounds we didn’t know we were missing, brought back to life on the FYF 💖 @Adam Barrera unpacks how nostalgia took over TikTok.",
      "published_at": "2026-10-20T15:23:03Z",
      "duration_ms": 105000,
      "width": 720,
      "height": 1280,
      "preview_image_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oYiO1Aj1aA7yiGqAi938DIhBKXXfIw5ACi9AEB~tplv-tiktokx-origin.image?dr=9636&x-expires=1793332800&x-signature=HSVC%2FUMCw2FVlIXL4rsBbxnkMJ8%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
      "author_id": "107955",
      "author_sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
      "author_username": "tiktok",
      "author_name": "TikTok",
      "author_image_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=bc102787&x-expires=1793332800&x-signature=YvpYWckR5tK8e%2FLw1saOLbSfOoM%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
      "author_verified": true,
      "author_follower_count": null,
      "view_count": null,
      "like_count": null,
      "comment_count": null,
      "share_count": null,
      "bookmark_count": null,
      "approx_author_follower_count": 96500000,
      "approx_view_count": 394000,
      "approx_like_count": 7089,
      "approx_comment_count": 1960,
      "approx_share_count": 655,
      "approx_bookmark_count": 607,
      "hashtags": null,
      "mentioned_usernames": [
        "adambarrera"
      ],
      "music_id": "7698770883132853023",
      "music_title": "original sound",
      "music_author_name": "TikTok"
    }
  ],
  "pagination": {
    "next_page_token": "pt1.dGlraHViOjE3ODg0NDQyMTkwMDA"
  }
}
```
