A high-speed TikTok location scraper that extracts geo-tagged posts, videos, and engagement metrics from any city or place feed. It solves the pain of manual TikTok location research by delivering clean, structured data for marketing, lead generation, and trend analysis. Pay-per-result pricing keeps costs predictable while you scale TikTok location scraping across multiple regions.
Created by Bitbash, built to showcase our approach to Scraping and Automation!
If you are looking for tiktok-location-scraper-pay-per-result you've just found your team — Let’s Chat. 👆👆
TikTok Location Scraper (Pay Per Result) is a geo-focused data extraction tool that collects posts and videos from TikTok location feeds. It fetches video URLs, engagement metrics, creator profiles, hashtags, and timestamps from any TikTok city, region, or place URL.
This project is designed for marketers, lead generators, agencies, researchers, and growth teams who need reliable TikTok location data at transparent, low per-post pricing. Instead of scrolling feeds and copying data manually, you get structured, analysis-ready output that can flow directly into dashboards, CRMs, or data pipelines.
- Extracts posts from any TikTok location URL (e.g., city, region, or place feeds with
?location=true). - Captures 30+ data points per post, including engagement metrics, creator info, video metadata, and hashtags.
- Operates at 400–600 posts per second for near real-time competitive and trend analysis.
- Uses a flexible pay-per-result model starting at $0.30 per 1,000 posts.
- Supports a custom map function so you can transform output on-the-fly for CRMs, BI tools, or lead scoring.
| Feature | Description |
|---|---|
| Pay-per-result pricing | Simple model starting at $0.30 per 1,000 posts, with linear, predictable cost as you scale. |
| Location URL support | Scrape TikTok posts from any location/tag URL, including city, region, and place feeds. |
| High-speed extraction | Processes roughly 400–600 posts per second for fast insights, even at large volumes. |
| Full engagement metrics | Collects views, likes, comments, shares, and bookmarks for every post. |
| Creator profiling | Grabs usernames, display names, IDs, follower counts, verification status, and video counts. |
| Rich video metadata | Extracts video URLs, width, height, duration, cover images, and thumbnails. |
| Hashtags and audio data | Captures hashtags plus song title, artist, album, duration, and cover art. |
| Custom map function | Optional JavaScript callback to compute engagement rates, lead scores, or normalized objects. |
| Budget control | maxItems lets you set exact limits so your spend never exceeds your planned budget. |
| Structured exports | Output is ready for JSON/CSV/Excel/XML/RSS exports and easy integration into external tools. |
| Field Name | Field Description |
|---|---|
id |
Unique TikTok post identifier. |
title |
Post caption or description text. |
views |
Total number of video views. |
likes |
Number of likes on the post. |
comments |
Number of comments on the post. |
shares |
Number of times the post was shared. |
bookmarks |
Count of saves/bookmarks for the post. |
hashtags |
Array of hashtags used in the post. |
postPage |
Public URL of the TikTok post. |
uploadedAt |
Unix timestamp of when the post was uploaded. |
uploadedAtFormatted |
ISO 8601 formatted upload date and time. |
channel.name |
Creator’s display name. |
channel.username |
Creator’s username/handle. |
channel.id |
Unique creator user ID. |
channel.url |
Public URL of the creator’s TikTok profile. |
channel.avatar |
URL of the creator’s profile picture. |
channel.verified |
Boolean flag indicating if the creator is verified. |
channel.followers |
Number of followers the creator has. |
channel.following |
How many other accounts the creator follows. |
channel.videos |
Total number of videos posted by the creator. |
video.width |
Video width in pixels. |
video.height |
Video height in pixels. |
video.ratio |
Video resolution label (for example, 540p, 720p). |
video.duration |
Video duration in seconds. |
video.url |
Direct URL to the video file. |
video.cover |
URL of the video cover image. |
video.thumbnail |
URL of the video thumbnail. |
song.id |
Unique identifier of the song/audio used. |
song.title |
Title of the song/audio. |
song.artist |
Name of the artist or creator of the audio. |
song.album |
Album name, if available. |
song.duration |
Duration of the audio in seconds. |
song.cover |
URL of the song/audio cover image. |
[
{
"id": "7310663737562631457",
"title": "#duet with @The Tus HouseThis is strangest #Steak & #Egg I've ever seen ! #ramsayreacts #eggcellent ",
"views": 2597080,
"likes": 200239,
"comments": 894,
"shares": 493,
"bookmarks": 5597,
"hashtags": [
"duet",
"steak",
"egg",
"ramsayreacts",
"eggcellent"
],
"channel": {
"name": "Gordon Ramsay",
"username": "gordonramsayofficial",
"id": "6747935906352907269",
"url": "https://www.tiktok.com/@gordonramsayofficial",
"avatar": "https://p16-amd-va.tiktokcdn.com/img/tos-maliva-avt-0068/7310612651137040390~c5_1080x1080.webp",
"verified": false,
"followers": 39745807,
"following": 513,
"videos": 451
},
"uploadedAt": 1702146548,
"uploadedAtFormatted": "2023-12-09T18:29:08.000Z",
"video": {
"width": 648,
"height": 576,
"ratio": "540p",
"duration": 57.399,
"url": "https://v16m.tiktokcdn-us.com/a5b6f0dc57ac9664bb9978f7bed3148b/video.mp4",
"cover": "https://p16-sign-useast2a.tiktokcdn.com/cover.jpeg",
"thumbnail": "https://p16-sign-useast2a.tiktokcdn.com/thumbnail.jpeg"
},
"song": {
"id": 7257270916026191000,
"title": "original sound - thetushouse",
"artist": "The Tus House",
"album": "",
"duration": 64,
"cover": "https://p19.tiktokcdn-us.com/img/avatar.webp"
},
"postPage": "https://www.tiktok.com/@gordonramsayofficial/video/7310663737562631457"
}
]
| Field | Type | Description | Default |
|---|---|---|---|
startUrls |
array | List of TikTok location URLs (for example, https://www.tiktok.com/tag/newyork?location=true) to scrape posts from specific geographic feeds. |
[] |
maxItems |
number | Maximum total number of posts to extract across the entire run; directly controls cost and dataset size. | Infinity |
customMapFunction |
string | JavaScript function (as a string) applied to each item to transform, enrich, or normalize output objects. Not intended for filtering. | null |
tiktok-location-scraper-pay-per-result/
├── src/
│ ├── main.js
│ ├── clients/
│ │ └── tiktokLocationClient.js
│ ├── mappers/
│ │ └── customMapFunction.example.js
│ ├── utils/
│ │ ├── parsing.js
│ │ └── logging.js
│ └── config/
│ └── inputSchema.json
├── data/
│ ├── sample-input.json
│ └── sample-output.json
├── package.json
├── apify.json
├── .gitignore
└── README.md
- Local marketing agencies use it to collect geo-tagged TikTok posts from specific cities, so they can design campaigns that match local trends and cultural nuances.
- Lead generation teams use it to discover creators and small businesses posting from target locations, so they can build high-intent outreach lists with engagement-based scoring.
- Brands and growth teams use it to track how their products and competitors perform across regions, so they can allocate budgets based on real engagement signals.
- Researchers and analysts use it to study geographic content patterns and trend diffusion, so they can back their reports with large, structured TikTok datasets.
- Real estate and local service providers use it to monitor community conversations and lifestyle content around neighborhoods, so they can position offers and messaging more effectively.
Provide one or more TikTok location URLs in the startUrls array, set maxItems to the number of posts you want, and run the scraper. The tool will fetch posts from the specified location feeds and store structured results that you can export as JSON, CSV, Excel, XML, or RSS.
Yes. You can include multiple location URLs in startUrls (for example, New York, Los Angeles, Chicago, and Miami) and set a global maxItems limit. The scraper will aggregate posts from all locations into one dataset while maintaining predictable pay-per-result pricing.
Pricing is linear and based on the number of posts extracted: $0.30 per 1,000 posts (that is, $0.0003 per post). For example, 100 posts cost $0.03, 10,000 posts cost $3.00, and 100,000 posts cost $30.00. A small free quota (such as 10 posts) can be used to validate output before running larger extractions.
customMapFunction is an optional JavaScript function that runs on every extracted post before it is stored. Use it to compute engagement rates, lead scores, or CRM-ready objects by adding, modifying, or removing fields. It should always return an object and must not be used to filter out items; filtering is best done after export to avoid issues.
Primary Metric: Typical extraction speed is around 400–600 posts per second, allowing roughly 1,000 posts in 2–3 seconds, 10,000 posts in under 30 seconds, and 50,000 posts in a few minutes under normal network conditions.
Reliability Metric: In stable environments, the scraper can achieve a success rate above 98–99% for valid TikTok location URLs, with automatic handling of most transient network and rate-limit issues.
Efficiency Metric:
Because pricing is strictly pay-per-result at $0.30 per 1,000 posts, throughput scales linearly with your budget, and maxItems ensures that resource usage and costs stay within defined limits.
Quality Metric: Each post returns 30+ well-structured fields (post, creator, video, engagement, and song metadata), providing high data completeness for analytics, BI modeling, and lead generation workflows without needing extensive post-processing.
