Skip to main content

GET /webcast/feed

Discover currently live TikTok LIVE streams. Uses a two-step “sign-and-return” pattern — the API returns a signed URL with headers and cookies that you fetch from YOUR own IP to get the actual TikTok feed data. Authentication: Include your TikTok session_id cookie for personalized, populated results. Without it, results are anonymous and limited (~5 rooms). Channels: 87 = Recommended — the main “For You” infinite scroll feed, 86 = Suggested — sidebar host recommendations (shown while watching), 89 or 1111006 = Gaming, 42 = Following (requires session). Geo-targeting: Feed results are determined by the IP address making the final TikTok fetch (Step 2), NOT by the region parameter. Since you fetch the signed URL from your own client, you’ll see content relevant to your geographic location. The region param is passed to TikTok but has minimal effect on results. Pagination: The API automatically switches to TikTok’s “load more” mode when you pass a max_time cursor. Fetch the signed URL → parse the TikTok JSON response → extract data.extra.max_time → pass it as max_time in your next call. Each page returns ~6-15 rooms; keep paginating for continuous discovery. The response also includes a load_more_url template — just replace {MAX_TIME} with the cursor. Rate limits: Pro: 100 calls/day. Ultra: 2,000 calls/day. Response includes feed_remaining and feed_limit fields. Response data: Each room includes owner.display_id (username), owner.nickname (display name), title, user_count (viewers), owner.avatar_thumb (profile photo), id_str (room ID), and more.
This endpoint requires a Basic tier subscription or higher.

Parameters

ParameterTypeRequiredDescription
session_idstringNoYour TikTok sessionid cookie — strongly recommended. Get from browser DevTools → Application → Cookies → tiktok.com. Without it, results are sparse.
channel_idstringNoFeed channel: 87 = Recommended “For You” (default), 86 = Suggested sidebar, 89 or 1111006 = Gaming, 42 = Following
countnumberNoRooms per page (default: 20, max: 50)
max_timestringNoPagination cursor from previous TikTok response (data.extra.max_time). Omit or “0” for first page.
regionstringNoHint passed to TikTok (default: US). Note: actual results are geo-targeted by the IP making the final fetch, not this param.
ttwidstringNoTikTok ttwid visitor cookie. Server provides one if omitted.
ms_tokenstringNoTikTok msToken cookie (optional, a placeholder is used if omitted).

Response

{
  "status_code": 0,
  "signed_url": "https://webcast.tiktok.com/webcast/feed/?...",
  "method": "GET",
  "headers": { "User-Agent": "...", "Referer": "https://www.tiktok.com/", ... },
  "cookies": "ttwid=...; sessionid=...; sessionid_ss=...",
  "region": "US",
  "channel_id": "87",
  "feed_remaining": 99,
  "feed_limit": 100,
  "note": "Fetch signed_url from your client/IP with these headers and cookies."
}

// After fetching signed_url, TikTok returns:
{
  "status_code": 0,
  "data": [{
    "data": {
      "id_str": "7123456789",
      "title": "🔴 Live Now!",
      "user_count": 1250,
      "owner": {
        "display_id": "streamer_name",
        "nickname": "Display Name",
        "avatar_thumb": { "url_list": ["https://..."] }
      }
    }
  }, ...],
  "extra": { "max_time": "1773128824428" }
}

Examples

// Step 1: Get signed URL with session for populated results
const res = await fetch(
  'https://api.tik.tools/webcast/feed?' + new URLSearchParams({
    apiKey: 'YOUR_KEY',
    session_id: 'YOUR_TIKTOK_SESSION_ID',  // from browser cookies
    region: 'US',
    channel_id: '87',  // 87=recommended, 86=suggested, 1111006=gaming
    count: '20',
  })
);
const { signed_url, headers, cookies, feed_remaining, feed_limit } = await res.json();
console.log(`Quota: ${feed_remaining}/${feed_limit} calls remaining`);

// Step 2: Fetch TikTok data from YOUR IP
const tikRes = await fetch(signed_url, {
  headers: { ...headers, Cookie: cookies }
});
const feed = await tikRes.json();

// Step 3: Parse live rooms
for (const entry of feed.data) {
  const room = entry.data;
  console.log(`🔴 @${room.owner.display_id} (${room.owner.nickname})`);
  console.log(`   "${room.title}" — ${room.user_count} viewers`);
}

// Step 4: Load more (pagination)
const nextCursor = feed.extra?.max_time;
if (nextCursor) {
  const page2 = await fetch(
    'https://api.tik.tools/webcast/feed?' + new URLSearchParams({
      apiKey: 'YOUR_KEY', session_id: 'YOUR_SESSION_ID',
      region: 'US', max_time: nextCursor, count: '20',
    })
  );
  // ... repeat Step 2-3
}