# TikTok Scraper: Hashtags, Search, Sounds, Places, Profiles (`transparent_meteorite/tiktok-hashtag-search-scraper`) Actor

TikTok scraper for hashtag feeds, keyword search, account search, sounds (music), places (locations) and profile videos or reposts. Video URL, caption, views, likes, comments, shares, date, creator, music, place, subtitles, optional MP4 download and transcript. No login.

- **URL**: https://apify.com/transparent_meteorite/tiktok-hashtag-search-scraper.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Scraper: hashtags, search, sounds, places and profiles

![TikTok Scraper: features, price and a real output row](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-tiktok-hashtag-search-scraper-banner-10141443.png)

[![Run it free on Apify](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-cta.png)](https://console.apify.com/actors/uMsa2UYbOLbAvfmJn/input)

| Price per 1,000 results | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| **This Actor** | **$2.10** | **$1.40** | **$1.05** | **$0.70** |
| Most-used alternative | $3.00 | $2.00 | $1.50 | $1.00 |

<sub>Pay per event, no monthly rental. Prices read from each Actor's public Apify pricing on 2026-10-15; check the Pricing tab for the current figure.</sub>

![TikTok Scraper sample output table from a real run](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-tiktok-hashtag-search-scraper-output-10141443.png)

Turn any TikTok hashtag, search keyword, sound, place or profile into a clean table of videos: video URL, caption, views, likes, comments, shares, saves, post date, duration, sound, tagged place, subtitles, hashtags, and the creator's username, follower count and bio link. Search accounts by keyword. Optionally save the MP4 files and the spoken transcript. No login, no cookies, no TikTok account.

- **In short:** TikTok Hashtag & Search Scraper (Apify actor `transparent_meteorite/tiktok-hashtag-search-scraper`) reads the public video feeds of TikTok hashtags, sounds (music), places (locations) and profiles (videos and reposts), plus TikTok video and account search, and returns one row per video or account.
- **Who it is for:** marketers and agencies finding trends and creators, brands tracking a campaign hashtag, influencer research, social listening, researchers.
- **Input:** hashtags; search keywords (videos or accounts); sound URLs or IDs; place URLs or IDs; profiles with videos and/or reposts; results per source; date, likes and views filters; max items; MP4, cover and subtitle download; transcript text; monitor mode; proxy.
- **Output:** 39 fields per video: id, webVideoUrl, text, playCount, diggCount, commentCount, shareCount, collectCount, createTimeISO, engagementRate, hashtags, isPinned, isSponsored, locationMeta (place, address, city, category), videoMeta (subtitleLinks, covers), musicMeta, authorMeta (name, fans, verified, bio link), mediaUrls, transcript. Account rows: username, name, bio, followers, likes, verified. JSON, CSV or Excel.
- **Pricing:** pay per event. Per video or account delivered: $0.0021 free plan, $0.0014 Bronze, $0.00105 Silver, $0.0007 Gold, Platinum and Diamond. MP4 download (optional): $0.0009 to $0.0003 per video.
- **Limits:** only what TikTok shows logged-out visitors; a feed usually runs to a few hundred videos, account search to about 10 accounts per keyword.

**Type a hashtag, sound, place or profile, press Start, get its videos as a table in under a minute.**

### Run in 30 seconds

1. Open the actor in [Apify Console](https://console.apify.com/actors?search=transparent_meteorite%2Ftiktok-hashtag-search-scraper) (a free Apify account is enough).
2. Press **Start** with the prefilled input: 30 videos of #cooking, about $0.09 on the free plan.
3. Open the **Output** tab: the **Videos** view is a table. Download as CSV, Excel or JSON.

```json
{
  "hashtags": ["cooking"],
  "searchQueries": ["pasta recipe"],
  "resultsPerPage": 30
}
```

An empty input `{}` also works: it reads 30 videos of #cooking.

### Use cases

- **Trend and content research:** pull the top videos for any hashtag with plays, likes and shares to see what is working right now.
- **Influencer and creator discovery:** find accounts posting under a niche hashtag and rank them by engagement.
- **Brand and campaign monitoring:** track a branded hashtag on a schedule and receive only new videos.
- **Market and competitor analysis:** compare hashtag, sound or place feeds over time and export to JSON, CSV or Excel.

### Why choose this over alternatives

| | This actor | Typical TikTok hashtag scrapers |
|---|---|---|
| Price per video (free plan) | **$0.0021** | $0.0037 |
| Price per video (Gold) | **$0.0007** | $0.0017 |
| Hashtags, search, sounds, places, profiles and account search in one run | **Yes** | Often separate tools |
| Tagged place (name, address, city, category) on every video | **Yes** | Rarely |
| Subtitle links, transcript text, MP4 download | **Yes** | Often extra tools |
| Hashtag total views and video count on every row | **Yes** | Rarely |
| Engagement rate per video | **Yes** | No |
| Date, likes and views filters, combined, no filter surcharge | **Yes** | Partly, often a surcharge |
| Monitor mode (only new videos) | **Yes** | No |
| Hashtags or searches that fail, filtered videos | **Not charged** | Varies |

### What you get: output fields

| Field | Meaning |
|---|---|
| `id`, `webVideoUrl` | Video ID and link |
| `text` | Caption |
| `playCount`, `diggCount`, `commentCount`, `shareCount`, `collectCount` | Views, likes, comments, shares, saves |
| `engagementRate` | (likes + comments + shares) / views, in percent |
| `createTime`, `createTimeISO` | When it was posted |
| `hashtags`, `mentions` | Hashtags and @mentions |
| `videoMeta` | Duration, size, cover and original cover, `subtitleLinks` (language, format, URL), `downloadAddr` when downloaded |
| `musicMeta` | Sound name, author, original sound flag, play URL, cover, `musicUrl` |
| `locationMeta` | Tagged place: name, address, city, country, category, `placeUrl` |
| `isPinned`, `isSponsored`, `hasTikTokShopProduct`, `effectStickers`, `slideshowImageLinks` | Profile pin, paid partnership, shop link, effects, photo-post images |
| `mediaUrls`, `transcript` | Stored MP4/cover links and spoken text, when requested |
| `searchMusic`, `searchPlace`, `fromProfileSection` | Which sound, place or profile section the row came from |
| `authorMeta` | Creator username, nickname, profile URL, verified, followers, following, likes, videos, bio, bio link |
| `isAd`, `isSlideshow`, `isAiGenerated`, `textLanguage`, `locationCreated` | Flags and language |
| `searchHashtag` | For hashtag feeds: name, ID, total views and total videos of the hashtag |
| `searchQuery`, `input`, `scrapedAt` | The keyword, the input, read time |

Sample row (shortened):

```json
{
  "id": "7638304516588195103",
  "webVideoUrl": "https://www.tiktok.com/@cristiiicarrillo/video/7638304516588195103",
  "text": "Creamy pasta recipe ... #creamypasta #pasta #easyrecipe",
  "playCount": 6700000,
  "diggCount": 267000,
  "commentCount": 1129,
  "shareCount": 53700,
  "createTimeISO": "2026-05-10T16:42:50.000Z",
  "engagementRate": 4.8,
  "authorMeta": { "name": "cristiiicarrillo", "fans": 94400, "verified": false },
  "searchQuery": "pasta recipe"
}
```

### Input options

- `hashtags`: hashtag names (`cooking`, `#cooking`) or `https://www.tiktok.com/tag/cooking` URLs.
- `searchQueries`: keywords or phrases, like the TikTok search box.
- `searchSection`: `videos` (default) or `users` for account search (rows of `type: "user"`: username, name, bio without e-mails, followers, likes, verified).
- `musics`: sound URLs (`https://www.tiktok.com/music/...-7061837257761639194`) or IDs: videos that use the sound.
- `places`: place URLs (`https://www.tiktok.com/place/...-42203861083965390`) or IDs: videos tagged at the place.
- `profiles` + `profileScrapeSections` (`videos`, `reposts`): a creator's feed.
- `resultsPerPage` (default 30): videos (or accounts) per source.
- `shouldDownloadVideos` + `maxVideoSizeMB` (default 60): save MP4s (best H.264 quality under the limit) to the run's key-value store. `shouldDownloadCovers`, `shouldDownloadSubtitles` (WebVTT), `includeTranscriptText`: covers, subtitle files and plain-text transcripts.
- `oldestPostDate`, `newestPostDate` (a date or "7 days"), `leastDiggs`, `mostDiggs`, `minPlayCount`: filters; skipped videos are not charged.
- `maxItems`: hard cap across the run. A run also stops at your **Max cost per run** setting.
- `monitorMode` + `monitorStoreName`: only videos not delivered before.
- `proxyConfiguration`: residential US by default (required, see below).

### Pricing

Pay per event. No subscription, no rental fee.

| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Video or account delivered | $0.0021 | $0.0014 | $0.00105 | $0.0007 | $0.0007 | $0.0007 |
| MP4 downloaded (only with Download videos on) | $0.0009 | $0.0007 | $0.00056 | $0.0003 | $0.0003 | $0.0003 |

| Videos | Free | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| 1,000 | $2.10 | $1.40 | $1.05 | $0.70 |
| 10,000 | $21 | $14 | $10.50 | $7 |

Not charged: sources that cannot be read after retries, downloads that fail or exceed the size limit, videos removed by a filter, and videos already delivered in monitor mode. Proxy traffic is included in the price.

### How to run it

- **Console:** fill the form, press Start.
- **API:** `POST https://api.apify.com/v2/acts/transparent_meteorite~tiktok-hashtag-search-scraper/run-sync-get-dataset-items?token=<TOKEN>` with the input JSON as the body.
- **Python:** `ApifyClient(token).actor("transparent_meteorite/tiktok-hashtag-search-scraper").call(run_input={"hashtags": ["cooking"], "resultsPerPage": 100})`
- **Schedules and integrations:** run daily with monitor mode on and send new videos to Google Sheets, Slack, Make, Zapier or n8n.

### Limits and honest caveats

- TikTok shows logged-out visitors a hashtag feed of a few hundred videos, ranked by TikTok, not every video ever posted with the tag. Large `resultsPerPage` values stop where TikTok's feed ends; the log says so.
- Account search returns the accounts TikTok shows on its first results page, usually 10 per keyword.
- Profile feeds come from TikTok's own profile page and reach a few dozen recent videos per section; for profile stats and filters, pair it with our TikTok Profile Scraper.
- Long videos are large (a 5-minute video is 35-110 MB); the size limit skips them and says why in `videoMeta.downloadError`.
- Search results follow TikTok's relevance ranking and vary by country; the default proxy is US.
- The actor runs a real headless browser so TikTok's own page code signs every request. That takes a few seconds per page, so runs are slower than plain-HTTP scrapers, but nothing is forged and no account is used.
- Residential US proxy is required: TikTok returns empty hashtag feeds to datacenter IPs. Video files, images and scripts are not sent through the proxy, which keeps the cost per video low.

### FAQ

**Do I need a TikTok account or cookies?** No.

**Can I get videos from several hashtags at once?** Yes: list them all; each gets up to `resultsPerPage` videos, and `searchHashtag` on each row tells you which hashtag it came from.

**Does it download the videos?** Yes, if you turn on **Download videos**: each MP4 is stored in the run's key-value store and linked in `mediaUrls`. Only download videos you have the rights to use.

**Can I get subtitles or a transcript?** Yes. `videoMeta.subtitleLinks` lists TikTok's caption files for every video that has them; **Add transcript text** puts the spoken words in a `transcript` field.

**Can I find every video at a restaurant or venue?** Yes: put the place URL in `places`. Every row has `locationMeta` with the name, address, city and category.

**Can I find small creators?** Yes: set `mostDiggs` (maximum likes) and read `authorMeta.fans`.

**What does a failed hashtag cost?** Nothing. Only delivered videos are charged.

### Common use cases and what to do with the data

**Brand and campaign monitoring.** Track a branded hashtag every day and keep a running log of who posts under it. Because each row carries `authorMeta`, `playCount` and `engagementRate`, you can rank participants by reach and spot the creators whose posts perform far above their follower count.

**Content research for creators and agencies.** Pull the top videos for five to ten niche hashtags, then look at `text`, `hashtags`, `musicMeta` and `videoMeta.duration` side by side. Patterns in caption length, sound choice and video length are easy to spot in a spreadsheet, and they tell you what the platform is currently rewarding in your niche.

**Influencer shortlists.** Run a keyword search in the users section and sort accounts by followers and likes. Pair the shortlist with hashtag runs to see whether a creator actually posts in your topic before you reach out.

**Market and trend reporting.** Schedule weekly runs for the same list of hashtags and compare average views and engagement from week to week. A rising average on a tag that was flat last month is an early signal worth reporting.

#### Fields most people use first

- `webVideoUrl` and `id` to link back to the video and deduplicate across runs.
- `playCount`, `diggCount`, `commentCount`, `shareCount` and `engagementRate` for performance ranking.
- `createTimeISO` for time series and recency filters.
- `authorMeta` for the creator's name, follower count and verified status.
- `musicMeta` and `hashtags` for trend and sound analysis.

#### More questions

**How many videos can I expect per hashtag?** TikTok serves logged-out visitors a ranked feed of a few hundred videos per tag, so a request for more simply ends where the feed ends. The log tells you when that happens.

**Can I run it on a schedule without paying twice for the same video?** Yes. Monitor mode returns only videos you have not received before, and each schedule should use its own `monitorStoreName`.

**Is the data live?** Counts are a snapshot taken when the page is read, so a video's views may be higher by the time you open the file. Run again later to build a time series.

**What happens if a run stops early?** Everything delivered before the stop stays in the dataset, and only delivered videos are charged.

### Use it from AI assistants (MCP)

TikTok Hashtag & Search Scraper works as a tool for AI assistants through the official Apify MCP server. Add this URL to any MCP client (Claude Desktop, Claude Code, Cursor, ChatGPT connectors, VS Code):

```
https://mcp.apify.com/?actors=transparent_meteorite/tiktok-hashtag-search-scraper
```

Then ask, for example: "Find the 50 most viewed #airfryer videos from the last 30 days and list their creators."

### Terms and responsible use

The actor reads only videos TikTok shows publicly to logged-out visitors. It does not return e-mail addresses from creators' bios. You are responsible for using the data lawfully (GDPR, CCPA, TikTok's terms). Do not use it for spam or harassment.

### Changelog

- 0.2 (2026-10-14): sounds, places, profiles (videos and reposts), account search, place/subtitle/pin/sponsor/shop fields, MP4/cover/subtitle downloads, transcripts, lower Gold+ price.
- 0.1 (2026-10-13): first release. Hashtag feeds, keyword search, hashtag stats, filters, monitor mode.

### Support

Found a bug or need a field? Open an issue on the Issues tab with the run URL. We reply there.

New to Apify? [Create a free account](https://console.apify.com/sign-up?fpr=rnmakg) and run this Actor in under a minute. Some links are affiliate links.

# Actor input Schema

## `hashtags` (type: `array`):

Hashtags without spaces, with or without #, or tiktok.com/tag/... URLs. Each returns the videos of that hashtag feed. Leave every source empty to run a #cooking test.

## `searchQueries` (type: `array`):

Keywords or phrases to search TikTok videos for, like typing in the TikTok search box.

## `searchSection` (type: `string`):

Videos returns matching videos. Accounts returns matching TikTok profiles (username, name, bio, followers, likes, verified) as rows of type user.

## `musics` (type: `array`):

tiktok.com/music/... URLs or numeric sound IDs. Returns the videos that use each sound.

## `places` (type: `array`):

tiktok.com/place/... URLs or numeric place IDs. Returns the videos tagged at each place, with the place name, address, city and category.

## `profiles` (type: `array`):

Usernames (with or without @) or profile URLs. Returns each profile's videos and/or reposts through TikTok's own feed.

## `profileScrapeSections` (type: `array`):

Which profile feeds to read.

## `resultsPerPage` (type: `integer`):

Maximum videos (or accounts) for each hashtag, keyword, sound, place and profile section.

## `oldestPostDate` (type: `string`):

A date (2026-10-01) or a period (7 days, 2 weeks, 3 months). Older videos are skipped and not charged.

## `newestPostDate` (type: `string`):

A date (2026-10-01, the whole day included) or a period. Newer videos are skipped and not charged.

## `leastDiggs` (type: `integer`):

Only videos with at least this many likes.

## `mostDiggs` (type: `integer`):

Only videos with at most this many likes (find small creators).

## `minPlayCount` (type: `integer`):

Only videos with at least this many views.

## `maxItems` (type: `integer`):

Stop after this many videos across all hashtags and keywords.

## `shouldDownloadVideos` (type: `boolean`):

Saves each video as an MP4 (no watermark, best H.264 quality under the size limit) in the run's key-value store and puts the link in mediaUrls and videoMeta.downloadAddr. Charged per downloaded video.

## `maxVideoSizeMB` (type: `integer`):

Videos larger than this in every quality are skipped (videoMeta.downloadError says why).

## `shouldDownloadCovers` (type: `boolean`):

Saves each cover image in the key-value store; videoMeta.coverUrl then points to the stored copy, which does not expire.

## `shouldDownloadSubtitles` (type: `boolean`):

Saves TikTok's subtitle file (English first) as WebVTT. Subtitle links in every language are always in videoMeta.subtitleLinks.

## `includeTranscriptText` (type: `boolean`):

Adds the spoken text of the video (from TikTok's own captions) as a transcript field. Videos without captions get none.

## `monitorMode` (type: `boolean`):

Remembers the video IDs it delivered (in a named key-value store) and next time returns only videos it has not seen. Use with a schedule.

## `monitorStoreName` (type: `string`):

Named key-value store that keeps the monitor state.

## `proxyConfiguration` (type: `object`):

Residential US is required: TikTok returns empty hashtag feeds to datacenter IPs. Images, video streams and scripts do not go through the proxy, so traffic stays small.

## Actor input object example

```json
{
  "hashtags": [
    "cooking"
  ],
  "searchQueries": [],
  "searchSection": "videos",
  "musics": [],
  "places": [],
  "profiles": [],
  "profileScrapeSections": [
    "videos"
  ],
  "resultsPerPage": 30,
  "shouldDownloadVideos": false,
  "maxVideoSizeMB": 60,
  "shouldDownloadCovers": false,
  "shouldDownloadSubtitles": false,
  "includeTranscriptText": false,
  "monitorMode": false,
  "monitorStoreName": "tiktok-hashtag-monitor",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "hashtags": [
        "cooking"
    ],
    "searchQueries": [],
    "musics": [],
    "places": [],
    "profiles": [],
    "resultsPerPage": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/tiktok-hashtag-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "hashtags": ["cooking"],
    "searchQueries": [],
    "musics": [],
    "places": [],
    "profiles": [],
    "resultsPerPage": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/tiktok-hashtag-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hashtags": [
    "cooking"
  ],
  "searchQueries": [],
  "musics": [],
  "places": [],
  "profiles": [],
  "resultsPerPage": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call transparent_meteorite/tiktok-hashtag-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,transparent_meteorite/tiktok-hashtag-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uMsa2UYbOLbAvfmJn/builds/XvsHeMEtqOQFqCMdj/openapi.json
