How to Scrape TikTok Data in 2026: Profiles, Videos, Comments
Get public TikTok profiles, videos, comments, hashtags, sounds and transcripts as clean JSON with one REST API: no scraper, no headless browser, no app review.
The simplest way to get public TikTok data in 2026 is a hosted scraping API: one HTTPS call returns a profile, a creator’s videos, comments, a hashtag feed or a video transcript as JSON. With crawlfeed, a profile or a page of videos costs 1 credit, needs only an API key, and comes back in the same shape as Instagram, YouTube and X data.
TikTok is where a lot of the internet's attention sits in 2026, and it is also one of the harder platforms to get data out of. This guide shows how to pull public TikTok data (profiles, videos, comments, hashtags, sounds and transcripts) with plain HTTPS calls, with working code in cURL, JavaScript and Python.
Why TikTok data is hard to get
Three things make TikTok different from a normal website:
- No public data API. TikTok's official APIs are either for approved academic research or for data a user grants your app on their own account. There is no endpoint that returns any creator's public videos for a commercial product.
- The web app is built against scrapers. Pages render client-side, request signatures change, and datacenter IPs get challenged. A scraper that works today often breaks next week.
- The data is awkwardly shaped. Counts come back as strings in one place and numbers in another, and video, author and music data are nested differently on every endpoint.
You can maintain a headless browser fleet with residential proxies, or you can call an API that already does it. The rest of this guide takes the second route.
What you can get from TikTok
Every call below is live on crawlfeed today. The table is generated from the API's own catalogue, so the endpoints and prices are exactly what you will be charged:
| Operation | Endpoint | Needs | Credits |
|---|---|---|---|
| Profile | /v1/tiktok/profile | handle | 1 |
| Posts | /v1/tiktok/posts | handle | 1 |
| Post | /v1/tiktok/post | id | 1 |
| Comments | /v1/tiktok/comments | post_id | 1 |
| Search | /v1/tiktok/search | q | 1 |
| Followers | /v1/tiktok/followers | handle | 1 |
| Following | /v1/tiktok/following | handle | 1 |
| Audience | /v1/tiktok/audience | handle | 26 |
| Live | /v1/tiktok/live | handle | 1 |
| Trending profiles | /v1/tiktok/trending/profiles | — | 1 |
| Linked profiles | /v1/tiktok/linked-profiles | handle | 10 |
| Hashtag | /v1/tiktok/hashtag | tag | 1 |
| Trending | /v1/tiktok/trending | — | 1 |
| Transcript | /v1/tiktok/transcript | id | 10 |
| Summary | /v1/tiktok/summary | id | 13 |
| Replies | /v1/tiktok/replies | post_id, comment_id | 1 |
| Search posts | /v1/tiktok/search/posts | q | 1 |
| Search profiles | /v1/tiktok/search/profiles | q | 1 |
| Top results | /v1/tiktok/search/top | q | 1 |
| Search suggestions | /v1/tiktok/search/suggestions | q | 1 |
| Collection posts | /v1/tiktok/collection/posts | id | 1 |
| Track | /v1/tiktok/track | id | 1 |
| Posts using a sound | /v1/tiktok/track/posts | id | 1 |
| Search products | /v1/tiktok/shop/search | q | 1 |
| Shop products | /v1/tiktok/shop/products | shop | 1 |
| Product | /v1/tiktok/shop/product | id | 1 |
| Product reviews | /v1/tiktok/shop/reviews | id | 1 |
| Creator showcase | /v1/tiktok/shop/showcase | handle | 1 |
| Search ads | /v1/tiktok/ads/search | q | 1 |
| An advertiser's ads | /v1/tiktok/ads | advertiser | 1 |
| Ad | /v1/tiktok/ad | id | 1 |
Everything comes back in crawlfeed's unified types (Profile, Post, Comment and friends), which are the same across all 26 platforms.
Get a TikTok profile
Start with a profile. You need an API key (new accounts get 100 free credits) and a handle, without the @:
curl -G https://api.crawlfeed.dev/v1/tiktok/profile \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "handle=charlidamelio"The response is a Profile wrapped in the standard envelope. Trimmed, and with illustrative numbers, it looks like this:
{
"data": {
"platform": "tiktok",
"handle": "charlidamelio",
"display_name": "charli d’amelio",
"verified": true,
"followers": 155000000,
"following": 1300,
"posts_count": 2800,
"bio": "…",
"links": ["…"]
},
"meta": { "credits_used": 1, "credits_remaining": 99, "cache": "MISS", "data_age_s": 0 }
}A profile costs 1 credit. Counts are numbers, never strings, and a field TikTok does not expose comes back as null rather than disappearing.
Get a creator's videos
/v1/tiktok/posts returns a creator's recent videos, newest first, one page per call:
curl -G https://api.crawlfeed.dev/v1/tiktok/posts \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "handle=charlidamelio"Each item is a Post with text, created_at, media (the video URL, thumbnail and duration), engagement (likes, comments, shares, views, saves), hashtags, mentions and is_ad.
To get the next page, pass meta.next_cursor back as cursor. When next_cursor is missing, you have reached the end. Every page is billed, so stop as soon as you have what you need:
let cursor;
const videos = [];
do {
const params = new URLSearchParams({ handle: 'charlidamelio', ...(cursor ? { cursor } : {}) });
const res = await fetch(`https://api.crawlfeed.dev/v1/tiktok/posts?${params}`, {
headers: { Authorization: `Bearer ${process.env.CRAWLFEED_KEY}` },
});
const { data, meta } = await res.json();
videos.push(...data);
cursor = meta.next_cursor;
} while (cursor && videos.length < 100);Get comments on a video
Pass the video id as post_id:
curl -G https://api.crawlfeed.dev/v1/tiktok/comments \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "post_id=<post_id>"Each Comment has the text, the author, likes, created_at and reply_to_id. For the replies under one comment, use /v1/tiktok/replies with the post_id and comment_id.
Search, hashtags and sounds
Three ways to discover content rather than read a known account:
- Keyword search:
/v1/tiktok/search/posts?q=…for videos,/v1/tiktok/search/profiles?q=…for creators. - Hashtags:
/v1/tiktok/hashtag?tag=…returns videos using a hashtag. - Sounds:
/v1/tiktok/track?id=…describes a sound, and/v1/tiktok/track/posts?id=…lists the videos that use it.
curl -G https://api.crawlfeed.dev/v1/tiktok/hashtag \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "tag=coffee"Get a TikTok video transcript
For research, summaries or feeding videos to an LLM, the transcript is usually what you want:
curl -G https://api.crawlfeed.dev/v1/tiktok/transcript \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "id=<id>"A transcript costs 10 credits because it costs more to produce upstream. When timings are available, each segment carries its start and end.
Handle errors and rate limits
Errors are RFC 9457 problem details with a stable code, so branch on the code, not the message:
| Code | What it means | What to do |
|---|---|---|
not_found | The handle or video does not exist, or is private | Check the id; do not retry |
rate_limited | You sent requests faster than your limit | Wait retry_after seconds |
insufficient_credits | Your balance is lower than the call's price | Top up; nothing was charged |
platform_unavailable | TikTok or the upstream failed | Retry later; the call was refunded |
A call that fails is refunded automatically, so retrying never charges you twice.
Add Arabic sentiment and dialect
If your audience writes in Arabic, add enrich=arabic to a profile, video or comments call. Each item gains an enrichment field with the dialect (Gulf, Egyptian, Levantine, Maghrebi or MSA), sentiment, entities and topics, for 3 extra credits per call.
Use TikTok data from Claude or Cursor
If you would rather ask than code, connect the crawlfeed MCP server and your assistant gets the same calls as tools:
claude mcp add --transport http crawlfeed https://mcp.crawlfeed.dev/mcp \
--header "Authorization: Bearer $CRAWLFEED_KEY"Then ask something like “what did @charlidamelio post this week, and which video got the most comments?”. The setup for every client is in our guide to MCP.
Wrapping up
For public TikTok data, a scraping API saves you from maintaining browsers, proxies and parsers that break every few weeks. With crawlfeed, most calls cost one credit, and the same code works for Instagram, YouTube and X. The full reference is at /docs/platforms/tiktok.
Questions
Is it legal to scrape TikTok data?
Collecting publicly available data is generally lawful in many jurisdictions, but it depends on where you are, what you collect and what you do with it. crawlfeed only returns public data and never logs in to accounts. If you store personal data, you are responsible for having a lawful basis under laws such as the GDPR, and for honouring deletion requests.
Does TikTok have an official API for this?
TikTok offers a Research API for approved academic researchers and APIs for data a user authorises on their own account. Neither lets a product read arbitrary public profiles and videos at scale, which is why most teams use a scraping API for public data.
How much does it cost to get TikTok data with crawlfeed?
Most TikTok calls cost 1 credit: a profile, a page of videos, a page of comments, a hashtag page or a search. A video transcript costs 10 credits and an audience breakdown 26, because the upstream charges more for them. New accounts get free credits, and failed calls are refunded.
How fresh is the data?
Responses are cached briefly to keep repeat calls fast and cheap. meta.cache and meta.data_age_s tell you how old a response is; add fresh=true to fetch it live for double the price.
Can I get TikTok data into Claude or Cursor?
Yes. The crawlfeed MCP server gives any MCP client the same TikTok calls as tools, using the same API key and credits.
Try it on your own data
Every example above runs as written. New accounts get 100 free credits, no card needed.
Get an API key