TikTok Video Scraper API
Our TikTok video scraper turns any video permalink into structured JSON: the caption, play, like, comment, save, and share counts, the author block, the music track, cover images, and hashtags in one request.
Why TikTok Video data fights back
A single TikTok video page keeps its engagement counts in an embedded state blob that datacenter IPs frequently get stripped or verify-walled, so a plain fetch returns a shell with no numbers. Selectors written against the hydrated grid break on the next layout change.
Fire your first TikTok Video Scraper API call
curl "https://api.tiktokscraperapi.com/api/v1/tiktok/video?url=https://www.tiktok.com/@scout2015/video/6718335390845095173&api_key=$API_KEY" import requests
BASE = "https://api.tiktokscraperapi.com/api/v1"
API_KEY = "YOUR_API_KEY"
# Pass the full video permalink as url (or an id plus author).
data = requests.get(
f"{BASE}/tiktok/video",
params={
"url": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
"api_key": API_KEY,
},
timeout=30,
).json()
print(data["author"]["uniqueId"], "-", data["title"])
s = data["stats"]
print(s["plays"], "plays,", s["likes"], "likes,", s["comments"], "comments")
print("hashtags:", ", ".join(data["hashtags"])) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
url | optional | - | The full TikTok video permalink, e.g. https://www.tiktok.com/@scout2015/video/6718335390845095173. Required unless you pass id (ideally with author). |
id | optional | - | The bare numeric video id. Pair it with author to build a clean canonical URL. |
author | optional | - | The creator @handle (no leading @), used with id to construct the permalink. |
country | optional | us | Two-letter country code for the exit region the request is routed through. Defaults to US, where TikTok serves the populated page. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
What the TikTok Video Scraper API hands back
{
"id": "6718335390845095173",
"url": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
"socialPlatform": "tiktok",
"title": "Scramble up ur name & I'll try to guess it 🐶❤️ #foryoupage #petsoftiktok #aesthetic",
"description": "Scramble up ur name & I'll try to guess it 🐶❤️ #foryoupage #petsoftiktok #aesthetic",
"caption": "Scramble up ur name & I'll try to guess it 🐶❤️ #foryoupage #petsoftiktok #aesthetic",
"create_time": 1564234358,
"created_at": "2019-07-27T13:32:38.000Z",
"author": {
"id": "53279706535428096",
"uniqueId": "scout2015",
"nickname": "Scout, Suki & Stella",
"verified": true,
"signature": "Click follow to join the PAWsitive Pack",
"avatar": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/4cbe05e194623e3f19aef975d9fdf26c~tplv-tiktokx-cropcenter:1080:1080.jpeg?x-expires=1783051200&x-signature=...",
"secUid": "MS4wLjABAAAAPZWNdkF_cmVSPCvV0Y6MCsH29mlAOlMOX3ikzGvlfMm3K6OMZv-JrRImpEHxdIMI",
"url": "https://www.tiktok.com/@scout2015"
},
"stats": {
"plays": 158400,
"likes": 35100,
"comments": 5756,
"shares": 1443,
"saves": 641
},
"statsV2": null,
"images": [
"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-p-0068/2367c7d45cf54a1397abd0e72bf22eac~tplv-tiktokx-origin.image?x-expires=1783051200&x-signature=..."
],
"thumbnail": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-p-0068/2367c7d45cf54a1397abd0e72bf22eac~tplv-tiktokx-origin.image?x-expires=1783051200&x-signature=...",
"video": {
"duration": 10,
"width": 576,
"height": 1024,
"cover": "https://p16-common-sign.tiktokcdn-us.com/...",
"dynamic_cover": "https://p16-common-sign.tiktokcdn-us.com/...",
"play_addr": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/...",
"download_addr": null
},
"music": {
"id": "6689804660171082501",
"title": "original sound",
"authorName": "tiff",
"duration": 10,
"cover": "https://p16-common-sign.tiktokcdn-us.com/...",
"play_url": "https://v16m.tiktokcdn-us.com/..."
},
"hashtags": [
"foryoupage",
"PetsOfTikTok",
"aesthetic",
"bonevoyage"
],
"price": null,
"currency": "USD",
"rating": null,
"reviews_count": null,
"_source": "rehydration"
} | Field | Type | Description |
|---|---|---|
id | string | The numeric video id. |
url | string | The canonical video permalink. |
title | string | The caption text (also returned as description and caption). |
create_time | integer | Publish time as a Unix timestamp; created_at is the ISO 8601 form. |
author | object | The creator: id, uniqueId, nickname, verified, signature, avatar, secUid, and url. |
stats | object | Numeric engagement: plays, likes, comments, shares, and saves. |
statsV2 | object | The exact string counts when TikTok ships them; null on the logged-out reflow page. |
images | array | Cover and poster image URLs for the video. |
thumbnail | string | The primary cover image URL. |
video | object | Media detail: duration, width, height, cover, dynamic_cover, play_addr, download_addr. |
music | object | The sound: id, title, authorName, duration, cover, and play_url. |
hashtags | array | Hashtags parsed from the caption and the structured challenge list. |
Where teams put TikTok Video data to work
Engagement tracking
Campaign reporting
Creator analysis
Sound and trend research
Content archiving
Hashtag performance
Why build on our TikTok Video Scraper API
Pass a permalink and we return the full item: caption, the five engagement counts, the author, the sound, cover images, and hashtags as flat JSON. Requests route through US residential proxies with anti-bot handling and retries at a 2.6s median, and when a stats-stripped shell comes back we fall back to the page's share metadata so you still get the numbers.
URL or id input
Full engagement block
Share-meta fallback
Residential anti-bot
Media and audio
Pay for success
TikTok Video Scraper API vs rolling your own
| Our API | DIY (requests / headless) | TikTok official API | |
|---|---|---|---|
| Input by video URL | Yes, url or id + author | Manual page fetch and parse | oEmbed only, no counts |
| Play and like counts | Numeric, with share-meta fallback | Blob often stripped from servers | Not exposed publicly |
| Setup | API key only | Proxies, headless browser, parser | Research API application |
| Anti-bot and proxies | Built in, US residential | You build and maintain it | Not applicable |
| Music and hashtags | Returned in one call | Extra parsing per field | Limited |
| Output | Flat JSON, stable schema | Raw state blob you parse | Restricted JSON |
Start free, then pay per call
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
A TikTok video scraper is a tool that reads a single public video's data and returns it in a structured format. Our TikTok video scraper API takes a video permalink and returns the caption, play, like, comment, share and save counts, the author block, the music track, cover images, and hashtags as JSON from one request.
Send a GET request to our tiktok/video endpoint with the video url and your API key. The stats object returns plays, likes, comments, shares, and saves as numbers. If a capture comes back with the engagement blob stripped, we parse the like and comment figures out of the page's share metadata so you still get counts back.
Yes. You can pass the full permalink as url, or the bare numeric id together with the author handle so we can build the canonical URL. Passing url is the simplest route and is what the examples use.
statsV2 holds the exact counts as strings and TikTok only ships it on some layouts. The logged-out reflow page that our residential requests usually land on drops statsV2, so it comes back null there while the numeric stats block is still populated. Use stats for the guaranteed numbers and statsV2 when it is present.
The video object includes play_addr and, when present, download_addr, along with the cover and dynamic_cover image URLs. These are the URLs TikTok exposes on the page; they are time-signed by TikTok and expire, so fetch them promptly if you need the media itself.
Median end-to-end response is about 2.6 seconds, including residential proxy routing, anti-bot handling, retries, and parsing. One call returns the full video item, so there is no need to chain requests to assemble the stats and metadata.