Scraper API

TikTok Scraper API

for account videos and keyword search

Pull TikTok videos as clean JSON, either every video from an account or everything matching a keyword or hashtag. Captions, hashtags, engagement counters and playable URLs come back parsed, with proxies and rendering handled for you.

SUCCESS
99.5%

of requests succeed

P50
3.1s

median response

P95
5.2s

95% finish faster

PRICE
$0.75

per 1k scrapes at volume

Stop maintaining scrapers

TikTok changes weekly. Your code shouldn't notice.

  • Signed URLs that expire in an hour
  • Signing params you re-derive after every release
  • An interstitial instead of the JSON payload
  • Rotating residential IPs
  • Cursor formats that change without notice
One integration commit replaces a backlog you’ll never finish.
scraper | git log
fix: signature params changed again
hotfix: web app returns an interstitial, not JSON
chore: rotate residential IPs
fix: playUrl expires after an hour
fix: hashtags moved to textExtra
hotfix: rate-limit loop on every second request
fix: pagination cursor format changed
chore: keep the headless fleet warm
fix: stats moved to statsV2, counts are strings
chore: bump the request signing lib again
fix: signature params changed again
hotfix: web app returns an interstitial, not JSON
chore: rotate residential IPs
fix: playUrl expires after an hour
fix: hashtags moved to textExtra
hotfix: rate-limit loop on every second request
fix: pagination cursor format changed
chore: keep the headless fleet warm
fix: stats moved to statsV2, counts are strings
chore: bump the request signing lib again
fix: signature params changed again
hotfix: web app returns an interstitial, not JSON
chore: rotate residential IPs
fix: playUrl expires after an hour
fix: hashtags moved to textExtra
hotfix: rate-limit loop on every second request
fix: pagination cursor format changed
chore: keep the headless fleet warm
fix: stats moved to statsV2, counts are strings
chore: bump the request signing lib again
fix: signature params changed again
hotfix: web app returns an interstitial, not JSON
chore: rotate residential IPs
fix: playUrl expires after an hour
fix: hashtags moved to textExtra
hotfix: rate-limit loop on every second request
fix: pagination cursor format changed
chore: keep the headless fleet warm
fix: stats moved to statsV2, counts are strings
chore: bump the request signing lib again
feat: integrate HasData API
Code Examples

One GET Request. That's the whole integration.

Start with just a query. Add more parameters when your use case needs them.

request example
curl -G 'https://api.hasdata.com/scrape/tiktok/search' \
	--data-urlencode 'keyword=dance' \
	--header 'x-api-key: <YOUR_API_KEY>' \
	--header 'Content-Type: application/json'
keyword * Keyword
The phrase to search for on TikTok.
type Result Type
What to search for — videos or users. Defaults to video.
nextPageToken Next Page Token
Defines the next page token. Use the `nextPageToken` value returned by the previous response. Omit it to fetch the first page.
TRY ALL 3 PARAMETERS FREE
Response

Search all of TikTok, or one account in full

Search returns a videos array and an account feed returns posts, with the same fields on each video apart from the two ready-made links search adds to the author. Read pagination.count for how many came back.

videos.json
// From the search endpoint: keyword or hashtag results from across TikTok.

[
  {
    "id": "7675122879293410591",
    "description": "Have you ever wondered what each shoe is made for? 🤭🏃‍♀️ should …",
    "hashtags": [
      "runner",
      "running",
      "runningshoes",
      "marathontraining",
      "runningshoesexplained"
    ],
    "createTime": "2026-08-17T21:56:58.000Z",
    "url": "https://www.tiktok.com/@saramontoyar/video/7675122879293410591",
    "duration": 36,
    "ratio": "720p",
    "coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/…",
    "playUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-use…",
    "downloadUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-use…",
    "author": {
      "id": "7330816931056845866",
      "username": "saramontoyar",
      "nickname": "Sara🏃‍♀️Runner&Gym Girl",
      "hasdataLink": "https://api.hasdata.com/scrape/tiktok/profile?handle=saramontoya…",
      "hasdataPostsLink": "https://api.hasdata.com/scrape/tiktok/posts?handle=saramontoyar"
    },
    "music": {
      "id": "7128257885397583874",
      "title": "Naughty Girl",
      "authorName": "Beyoncé",
      "playUrl": "https://sf19.tiktokcdn-us.com/obj/tos-alisg-ve-2774/cbe9585cb0eb…"
    },
    "likes": 495,
    "comments": 31,
    "shares": 36,
    "plays": 10600,
    "collects": 137,
    "reposts": 0
  }
]
Fields in videos
id string

Video id, the number after /video/ in the URL

description string

Caption text as posted, absent when the video has no caption

hashtags string[]

Tags parsed out of the caption, without the #. Absent when the caption has none

mentions string[]

@-mentions parsed from the caption, present when the caption has one

createTime string

Upload time, ISO 8601

url string

Video URL

duration number

Length in seconds

ratio / width / height string, number

Quality label as TikTok reports it, such as 720p, with the pixel size. The label is missing on some videos

coverUrl / dynamicCoverUrl string

Still and animated thumbnails

playUrl / downloadUrl string

Playable and downloadable video URLs, when TikTok exposes them for that video

author object

id, username and nickname, plus verified when the account carries the badge

music object

id and title always, plus authorName, original and playUrl when TikTok returns them

likes / comments / shares number

Engagement counters

plays / collects / reposts number

Views and saves. reposts is present but comes back 0

author.hasdataLink / hasdataPostsLink string

Ready-made calls for that account's profile and its videos. Search results only

What We Offer

The hard parts already happened

JS rendering, signed URL refresh and residential proxy rotation run on our side. Your code sends one GET and reads fields.

Loved by developers

Teams that deleted their scraper

Now it's the part of the pipeline they don't think about

4.8 ★★★★★
across 100+ reviews on 5 platforms
Trustpilot Trustpilot ★★★★★

HasData delivers exactly what we need: speed and comprehensive search features. It's the fastest API we've used in this space. Plus, their customer support is fantastic.

Denver Sinclair
Denver Sinclair
Capterra Capterra ★★★★★

We rely on HasData for search performance data and broader scraping needs. Their APIs deliver highly structured data that integrates directly into our platforms.

JN
Jacob N.
Trustpilot Trustpilot ★★★★★

Great web scraping API which is incredibly easy to use. It requires minimal effort to get up and running, and the documentation is very clear and helpful.

Arnold Foster
Arnold Foster
Trustpilot Trustpilot ★★★★★

I needed to scrape some information they didn't already support, and they wrote the code for me right away, which was super nice of them.

Hussein Ali
Hussein Ali
Clutch Clutch ★★★★★

We were particularly impressed with how easily we could integrate HasData into our existing workflow.

TB
Taras Bazyshyn
CEO at BAZTDL Sp. z o.o
Pricing

Plans that get cheaper at scale

Fixed price, fixed volume, no surprises at the end of the month. Upgrade when you need more.

Free
$0 /mo
One-time free trial
100 scrapes to start
1,000 credits, one time
1 concurrent request
Team seats
Community support
Start free
Startup
$49 /mo
$2.45 / 1k scrapes
20K scrapes / month
200K credits / month
15 concurrent requests
Team seats
Email support
Get started
Business
Recommended
$99 /mo
$0.99 / 1k scrapes
100K scrapes / month
1M credits / month
30 concurrent requests
Team seats
Priority email support
Get started
Growth
$249 /mo
$0.83 / 1k scrapes
3M credits / month
50 concurrent requests
Team seats
Dedicated account manager
Get started
Monthly scrape volume
Free 100K 500K 2M 6M 10M
Best fit
Business
scrapes / mo
100K
Concurrency
30
$ / 1k scrapes
$0.99
$99 /mo
Get Started
Enterprise
Custom price based on required volume

Past 100M credits a month, or terms the self-serve plans do not cover. We shape the contract around your workload.

Credits rollover
Unused credits carry into the next billing period.
Concurrency 2000+
Parallel request limits set to your peak load.
#1 request priority
Highest speed, always first in the queue.
Personal manager
A direct line to the founding team.
SSO
SAML single sign-on for the whole team.
SOC-2 compliance
Security review, DPA, and audit reports.
Talk to sales Quote within one business day
FAQ

Questions, answered

1 Grab your API key 2 Send a GET request 3 Get structured JSON

Your first scrape
is minutes away

100 scrapes free · no credit card