Skip to content
ScrapeField

TikTok scraper API

Profiles and followers, videos, comments, search, the trending feed and the Ad Library, with the field names TikTok’s own APIs use. Blocks handled; nothing for you to unblock.

Endpoints
8
From
3 credits a call
Returns
profile, video, comment, hashtag, ad
tiktok.com/@blue.door.coffee/video/7412345678901234567
B309.2K11.8K18.3K6.5K
@blue.door.coffee

Same corner, four years apart. #roastery #citywalk #fyp

original sound - blue.door.coffee

Extracted data

  1. 1username "blue.door.coffee"
  2. 2like_count 309238
  3. 3comment_count 11779
  4. 4share_count 6484
  5. 5video_description "Same corner, four years apart. #roastery #c…
  6. 6music.title "original sound - blue.door.coffee"
  7. view_count 3801250
  8. favorites_count 18303
  9. duration 26

Try it now

Every TikTok endpoint, as an MCP tool, as a REST call, or as a question in plain English. Each one runs against the live API in demo mode — no key, no account. For an agent: the TikTok MCP server.

POSThttps://scrapefield.com/mcp
8 tools
Transport
HTTP, JSON-RPC 2.0
Methods
initialize · tools/list · tools/call
Auth
Bearer key (or none for demo mode)
claude mcp add --transport http scrapefield https://scrapefield.com/mcp

What people build with it

Three worked examples, each with the calls it makes and what a run costs — multiplied out from the published price of every call.

01

Spot a trend while it is still early

Search a term once a day and rank the videos by views per day since they were posted. What climbs that list fastest is what is about to be everywhere.

The calls, and what each costs
GET tiktok/search× 3090 cr
a month, one term daily90 cr

≈ $0.054 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const q = { query: 'sourdough', type: 'video', limit: 30 };
const { data } = await sf('tiktok/search', q);

const ranked = data
  .filter((v) => v.create_time && v.view_count !== null)
  .map((v) => {
    const age = (Date.now() - Date.parse(v.create_time)) / 864e5;
    const days = Math.max(age, 1);
    return { url: v.share_url, perDay: Math.round(v.view_count / days) };
  })
  .sort((a, b) => b.perDay - a.perDay);

console.table(ranked.slice(0, 10));
02

Vet a creator before you pay one

Follower counts are easy to inflate; median views are not. Read the profile and the last thirty videos, and you have the audience a post will actually reach and how much of it engages.

The calls, and what each costs
GET tiktok/profile× 13 cr
GET tiktok/videos× 13 cr
per creator6 cr

≈ $0.004 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const { data: profile } = await sf('tiktok/profile', { username });
const q = { username, limit: 30 };
const { data: videos } = await sf('tiktok/videos', q);

const views = videos.map((v) => v.view_count ?? 0).sort((a, b) => a - b);
const engaged = videos.reduce(
  (s, v) => s + (v.like_count ?? 0) + (v.comment_count ?? 0), 0,
);

console.log({
  followers: profile.follower_count,
  medianViews: views[Math.floor(views.length / 2)],
  engagement: engaged / views.reduce((s, n) => s + n, 0),
});
03

Find the questions in the comments

Under a brand’s videos, the comments are an unfiltered support queue. Pull them for each video and keep the ones that ask something — with the likes that show how many people want the same answer.

The calls, and what each costs
GET tiktok/comments× 100300 cr
100 videos, 50 comments each300 cr

≈ $0.179 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const questions = [];

for (const url of brandVideos) {
  const { data } = await sf('tiktok/comments', { url, limit: 50 });
  for (const c of data.filter((c) => c.text?.includes('?'))) {
    const { text, like_count, reply_count } = c;
    questions.push({ video: url, text, like_count, reply_count });
  }
}

questions.sort((a, b) => b.like_count - a.like_count);

Everything that comes back

The complete response behind the TikTok view at the top of this page, from GET /v1/tiktok/video — every field, including the ones that are null. Fields are named after TikTok's Display and Research APIs, so if you have read those docs you already know them. Every field of tiktok_profile, tiktok_video, tiktok_comment, tiktok_hashtag and tiktok_ad is documented.

{
  "data": {
    "id": "7412345678901234567",
    "share_url": "https://www.tiktok.com/@blue.door.coffee/video/7412345678901234567",
    "username": "blue.door.coffee",
    "video_description": "Same corner, four years apart. #roastery #citywalk #fyp",
    "create_time": "2026-07-22T10:38:13.000Z",
    "duration": 26,
    "cover_image_url": "https://cdn.example/tt/7412345678901234567.jpeg",
    "play_url": "https://cdn.example/tt/7412345678901234567.mp4",
    "view_count": 3801250,
    "like_count": 309238,
    "comment_count": 11779,
    "share_count": 6484,
    "favorites_count": 18303,
    "hashtag_names": [
      "roastery",
      "citywalk",
      "fyp"
    ],
    "region_code": "US",
    "music": {
      "id": "7267972559455164041",
      "title": "original sound - blue.door.coffee",
      "author": "blue.door.coffee",
      "original": true
    },
    "duet_enabled": true,
    "stitch_enabled": false
  },
  "meta": {
    "request_id": "req_7f3ac1e94b2d40f8a1c6e5d2",
    "credits_charged": 3,
    "credits_remaining": 74218,
    "cached": false,
    "fetched_at": "2026-09-20T09:12:03Z",
    "next_cursor": null
  }
}

Endpoints and prices

One published credit cost per endpoint, charged per call and refunded automatically when a call fails. See what a credit costs.

Coming from Apify’s TikTok Scraper

TikTok Scraper costs $3.70 per 1,000 videos on Apify’s free plan, $1.70 on its Business plan, and a fee for each run. Here, about 30 videos come back a call, so 1,000 cost about $0.08 on our smallest pack and $0.04 on our largest, with no run to start or poll. Its fields, and ours. Apify’s price was read on 9 October 2026; the full comparison has where Apify wins.

TikTok Scraper and ScrapeField, field by field
TikTok ScraperScrapeField
textvideo_description
createTimeISOcreate_time
playCountview_count
diggCountlike_count
commentCountcomment_count
shareCountshare_count
collectCountfavorites_count
hashtagshashtag_names
webVideoUrlshare_url
authorMeta.nameusername
musicMetamusic

TikTok, specifically

The questions people ask about this platform before they call it. And how this compares with the platform’s own API: ScrapeField vs the TikTok Research API.

Can I search by hashtag or for accounts?
Yes: tiktok/search takes type=video, user or hashtag, and returns videos by default.
Do I get the video files?
You get play_url and cover_image_url on TikTok’s own CDN, with the duration. The play URL is signed by TikTok and stops working after a while, so fetch the file soon if you need it. We do not store or rehost the files.
What counts come with a video?
view_count, like_count, comment_count, share_count and favorites_count (saves) — the names TikTok’s own APIs use — plus the sound in music, and whether duets and stitches are allowed.
How far back can I read an account?
Up to 30 recent videos per call, and meta.next_cursor for the page after.
Does it need my TikTok login?
No. We never take a login, a cookie or a session for any platform, at any price.

The same key, four more platforms

One key, one balance and one invoice across all five — and each platform’s data in its own shape, because they are five different systems.

Your first TikTok call, in a minute

Get a key