# TikTok API — public tiktok.com data without login: user profiles and their videos, reposts followers, playlists, stories and LIVE status; video details with full stats and paid-partnership / promotional / shop disclosure; comments and replies; search for videos, photo posts and users; hashtag and sound pages with their video feeds; trending, For-You and related-video feeds. Every field TikTok sends is returned.

> A TikTok account's public profile: nickname, bio and bio link, verified/private flags, region, avatar, follower / following / like / video counts, its sec_uid (used by the list actions), whether it has an active story and the LIVE room id the profile page shows while it broadcasts (use user_live for real-time LIVE status). Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.
> ReefAPI engine `tiktok` · 21 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/tiktok/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Clients that add connectors by URL, such as ChatGPT and the Claude app, connect with OAuth 2.1 (the user pastes their key once on a ReefAPI page; discovery at `/.well-known/oauth-protected-resource/mcp`). Config files send the key as `Authorization: Bearer <key>`. `?key=<key>` in the URL also works as a last-resort fallback.

## Endpoints

### POST https://api.reefapi.com/tiktok/v1/user_profile — 2 credits
A TikTok account's public profile: nickname, bio and bio link, verified/private flags, region, avatar, follower / following / like / video counts, its sec_uid (used by the list actions), whether it has an active story and the LIVE room id the profile page shows while it broadcasts (use user_live for real-time LIVE status). Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).

**Returns:** {id, username, nickname, sec_uid, verified, avatar, url, bio, bio_link, private, region, language, created_at, is_business, category, is_live, live_room_id, has_story, stats{follower_count, following_count, like_count, video_count, friend_count}, + every field TikTok sent, response_extra}

**Example request body:**
```json
{
  "username": "tiktok"
}
```

### POST https://api.reefapi.com/tiktok/v1/user_videos — 2 credits
The videos an account posted, newest first (pinned videos flagged), with full stats, music and hashtags. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).
- `sec_uid` (string, optional) — The account's sec_uid (returned by user_profile). Saves one lookup; either this or username is required.
- `cursor` (string, optional, default "0") — Pagination cursor: 0 for the newest page, then the `cursor` returned by the previous page. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 30) — How many videos to ask TikTok for per page, 1-35 (default 30). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, cursor, has_more, private_account (true = private: TikTok returns no videos)

**Example request body:**
```json
{
  "username": "tiktok",
  "count": 10
}
```

### POST https://api.reefapi.com/tiktok/v1/user_reposts — 2 credits
Videos an account reposted (public reposts tab), with full stats. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).
- `sec_uid` (string, optional) — The account's sec_uid (returned by user_profile). Saves one lookup; either this or username is required.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 30) — How many videos to ask TikTok for per page, 1-35 (default 30). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, cursor, has_more

**Example request body:**
```json
{
  "username": "mrbeast"
}
```

### POST https://api.reefapi.com/tiktok/v1/user_followers — 2 credits
Accounts that follow a user (public follower list), newest followers first, each with bio and counts. Paginate with the returned cursor. (The FOLLOWING list is login-only on TikTok.) Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).
- `sec_uid` (string, optional) — The account's sec_uid (returned by user_profile). Saves one lookup; either this or username is required.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 30) — How many followers to ask TikTok for per page, 1-30 (default 30). TikTok may return a few less than asked.

**Returns:** followers[]{id, username, nickname, sec_uid, verified, avatar, url, bio, follower_count, following_count, like_count, video_count}, total, cursor, has_more

**Example request body:**
```json
{
  "username": "mrbeast"
}
```

### POST https://api.reefapi.com/tiktok/v1/video_detail — 2 credits
One video or photo post: caption, author, sound, hashtags, mentions, location, duration, cover, play and download URLs, and play / like / comment / share / save / repost counts. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `video_id` (string, required) — 19-digit TikTok video id, or a video URL (https://www.tiktok.com/@user/video/<id>).

**Returns:** video{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}

**Example request body:**
```json
{
  "video_id": "7106594312292453675"
}
```

### POST https://api.reefapi.com/tiktok/v1/comments — 2 credits
Top-level comments on a video with text, likes, reply count, author and whether the creator liked or pinned it. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `video_id` (string, required) — 19-digit TikTok video id, or a video URL (https://www.tiktok.com/@user/video/<id>).
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 20) — How many comments to ask TikTok for per page, 1-50 (default 20). TikTok may return a few less than asked.

**Returns:** comments[]{id, text, created_at, like_count, reply_count, language, liked_by_author, pinned_by_author, video_id, author{...}}, total, cursor, has_more

**Example request body:**
```json
{
  "video_id": "7106594312292453675"
}
```

### POST https://api.reefapi.com/tiktok/v1/comment_replies — 2 credits
Replies under one comment (the comment id comes from `comments`). Paginate with the cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `video_id` (string, required) — 19-digit TikTok video id, or a video URL (https://www.tiktok.com/@user/video/<id>).
- `comment_id` (string, required) — The comment id from the comments action.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 20) — How many replies to ask TikTok for per page, 1-50 (default 20). TikTok may return a few less than asked.

**Returns:** replies[]{id, text, created_at, like_count, language, reply_to_comment_id, author{...}}, total, cursor, has_more

**Example request body:**
```json
{
  "video_id": "7106594312292453675",
  "comment_id": "7115421954489156357"
}
```

### POST https://api.reefapi.com/tiktok/v1/search_videos — 2 credits
Videos matching a keyword, as TikTok's logged-out search ranks them: the 'Top' tab's video results (default) or the 'Videos' tab (tab=videos). Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `keyword` (string, required) — What to search for.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `search_id` (string, optional) — Optional for page 2+: the search_id returned by the FIRST page (the returned cursor already remembers it; pass this only if you build cursors yourself).
- `region` (enum, optional, default "de") — Which country TikTok searches from. TikTok requires a login to search from the US, so search runs from Europe; 'gb' gives English-market results, 'de' is the default. [one of: de, gb]
- `tab` (enum, optional, default "top") — Which logged-out search tab to read. [one of: top, videos]

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, cursor, has_more, search_id, region, tab

**Example request body:**
```json
{
  "keyword": "pizza recipe"
}
```

### POST https://api.reefapi.com/tiktok/v1/search_users — 2 credits
Accounts matching a keyword, with follower counts and bios. Paginate with cursor + search_id. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `keyword` (string, required) — What to search for.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `search_id` (string, optional) — Optional for page 2+: the search_id returned by the FIRST page (the returned cursor already remembers it; pass this only if you build cursors yourself).
- `region` (enum, optional, default "de") — Which country TikTok searches from. TikTok requires a login to search from the US, so search runs from Europe; 'gb' gives English-market results, 'de' is the default. [one of: de, gb]

**Returns:** users[]{id, username, nickname, sec_uid, verified, avatar, url, bio, follower_count, following_count, like_count, video_count}, cursor, has_more, search_id, region

**Example request body:**
```json
{
  "keyword": "pizza recipe"
}
```

### POST https://api.reefapi.com/tiktok/v1/hashtag_info — 2 credits
A hashtag's page data: id, description, cover, total views and video count. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `hashtag` (string, optional) — Hashtag name with or without #, or a tag URL (https://www.tiktok.com/tag/pizza).

**Returns:** {id, name, description, cover, url, video_count, view_count}

**Example request body:**
```json
{
  "hashtag": "pizza"
}
```

### POST https://api.reefapi.com/tiktok/v1/hashtag_videos — 2 credits
Videos under a hashtag, as the hashtag page lists them. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `hashtag` (string, optional) — Hashtag name with or without #, or a tag URL (https://www.tiktok.com/tag/pizza).
- `hashtag_id` (string, optional) — The hashtag id (from hashtag_info); saves one lookup.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 30) — How many videos to ask TikTok for per page, 1-35 (default 30). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, hashtag{id, name}, cursor, has_more

**Example request body:**
```json
{
  "hashtag": "pizza",
  "count": 10
}
```

### POST https://api.reefapi.com/tiktok/v1/music_info — 2 credits
A sound's page data: title, artist, album, duration, original-sound flag, audio URL, cover and how many videos use it. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `music_id` (string, required) — TikTok sound id, or a sound URL (https://www.tiktok.com/music/<name>-<id>).

**Returns:** {id, title, author, album, duration_s, original, play_url, cover, url, video_count, author_profile{...}}

**Example request body:**
```json
{
  "music_id": "7016547803243022337"
}
```

### POST https://api.reefapi.com/tiktok/v1/music_videos — 2 credits
Videos that use a sound. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `music_id` (string, required) — TikTok sound id, or a sound URL (https://www.tiktok.com/music/<name>-<id>).
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 30) — How many videos to ask TikTok for per page, 1-35 (default 30). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, cursor, has_more

**Example request body:**
```json
{
  "music_id": "7016547803243022337"
}
```

### POST https://api.reefapi.com/tiktok/v1/trending — 2 credits
TikTok's Explore page: currently trending videos with full stats. Each call returns a fresh set. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `count` (integer, optional, default 16) — How many videos to ask TikTok for per page, 1-30 (default 16). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}

**Example request body:**
```json
{
  "count": 16
}
```

### POST https://api.reefapi.com/tiktok/v1/feed — 2 credits
The logged-out For-You feed: a fresh page of recommended videos with full stats on every call. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `count` (integer, optional, default 16) — How many videos to ask TikTok for per page, 1-30 (default 16). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}

**Example request body:**
```json
{
  "count": 16
}
```

### POST https://api.reefapi.com/tiktok/v1/search_photos — 2 credits
Photo (slideshow) posts matching a keyword, from TikTok's logged-out Photo search tab, with image URLs and full stats. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `keyword` (string, required) — What to search for.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `search_id` (string, optional) — Optional for page 2+: the search_id returned by the FIRST page (the returned cursor already remembers it; pass this only if you build cursors yourself).
- `region` (enum, optional, default "de") — Which country TikTok searches from. TikTok requires a login to search from the US, so search runs from Europe; 'gb' gives English-market results, 'de' is the default. [one of: de, gb]

**Returns:** posts[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, cursor, has_more, search_id, region

**Example request body:**
```json
{
  "keyword": "pizza recipe"
}
```

### POST https://api.reefapi.com/tiktok/v1/user_playlists — 2 credits
A creator's public playlists (TikTok 'mixes'): name, video count, cover. Feed an id to playlist_videos. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).
- `sec_uid` (string, optional) — The account's sec_uid (returned by user_profile). Saves one lookup; either this or username is required.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 20) — How many playlists to ask TikTok for per page, 1-20 (default 20). TikTok may return a few less than asked.

**Returns:** playlists[]{id, name, video_count, cover, creator{...}}, cursor, has_more

**Example request body:**
```json
{
  "username": "mrbeast"
}
```

### POST https://api.reefapi.com/tiktok/v1/playlist_videos — 2 credits
The videos in one public playlist, in playlist order. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `playlist_id` (string, required) — Playlist id from user_playlists, or a playlist URL.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.
- `count` (integer, optional, default 30) — How many videos to ask TikTok for per page, 1-35 (default 30). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, cursor, has_more

**Example request body:**
```json
{
  "playlist_id": "7596415294902389534"
}
```

### POST https://api.reefapi.com/tiktok/v1/user_stories — 2 credits
An account's active stories (TikTok keeps them 24 hours), newest first, each as a full video or photo record with stats. An account with no story returns an empty list; user_profile's has_story says whether one is up. Paginate with the returned cursor. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).
- `user_id` (string, optional) — The account's numeric id (user_profile `id`); saves one lookup.
- `cursor` (string, optional, default "0") — 0 for the first page, then the returned `cursor`. Pass it back exactly as returned: it also lets us drop items TikTok repeats between pages, so a page may hold slightly fewer than `count`.

**Returns:** stories[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}, total, cursor, has_more, response_extra

**Example request body:**
```json
{
  "username": "mrbeast"
}
```

### POST https://api.reefapi.com/tiktok/v1/user_live — 2 credits
Whether an account is broadcasting LIVE right now, and its current (or last) LIVE room: title, viewer count, total entries, start time, cover and stream URLs. No signature needed - TikTok's own logged-out LIVE page data. Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `username` (string, optional) — TikTok username with or without @, or a profile URL (https://www.tiktok.com/@mrbeast).

**Returns:** {is_live, status(2 live / 4 ended / null never), room_id, title, viewer_count, enter_count, started_at, cover, user{...}, live_room{every field TikTok sent}, stats, response_extra}

**Example request body:**
```json
{
  "username": "mrbeast"
}
```

### POST https://api.reefapi.com/tiktok/v1/related_videos — 2 credits
Videos TikTok recommends next to a given video ('You may like'). Every record also carries every field TikTok sent, unmodified, next to the named fields; envelope fields of TikTok's answer are in response_extra.

**Parameters:**
- `video_id` (string, required) — 19-digit TikTok video id, or a video URL (https://www.tiktok.com/@user/video/<id>).
- `count` (integer, optional, default 16) — How many videos to ask TikTok for per page, 1-30 (default 16). TikTok may return a few less than asked.

**Returns:** videos[]{id, description, created_at, url, type(video|photo), duration_s, width, height, cover, play_url, download_url, images[], language, location, is_ad, is_pinned, hashtags[], mentions[], author{id, username, nickname, sec_uid, verified, avatar, url}, music{id, title, author, album, duration_s, original, play_url, cover, url}, stats{play_count, like_count, comment_count, share_count, save_count, repost_count}, paid_partnership, promotional_content, partner_brand, is_shop_video, has_product_anchor, disclosure_label, + every field TikTok sent (unmodified)}

**Example request body:**
```json
{
  "video_id": "7106594312292453675"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=tiktok
- Human docs page: https://reefapi.com/docs/tiktok
- Overview page: https://reefapi.com/tiktok-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
