# TikTok Hashtag Scraper - Scrape Videos by Tag (`logiover/tiktok-hashtag-video-scraper`) Actor

Scrape TikTok by hashtag or keyword, no API key. Export TikTok video data to CSV/JSON with views, likes, sound & author. A TikTok unofficial API.

- **URL**: https://apify.com/logiover/tiktok-hashtag-video-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Social media, Marketing, Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## TikTok Hashtag Scraper - Scrape Videos by Tag or Keyword

Scrape TikTok videos in bulk by hashtag or keyword and turn any tag into a rich video dataset. This TikTok hashtag scraper and keyword video crawler collects every matching post with complete engagement metrics, sounds, hashtags and author details — no login, no cookies, no API key.

Feed it `#booktok`, `morning routine` or any mix of tags and keywords, then sort the output by most views, most likes or most recent to surface exactly the videos you need.

![No login required](https://img.shields.io/badge/%E2%9C%93_No_login-no_cookies-2ea44f?style=for-the-badge)
![High volume](https://img.shields.io/badge/Built_for-high_volume-1f6feb?style=for-the-badge)
![Export](https://img.shields.io/badge/Export-JSON%C2%B7CSV%C2%B7Excel%C2%B7API-f59e0b?style=for-the-badge)
![Account safe](https://img.shields.io/badge/0%25-account_ban_risk-9333ea?style=for-the-badge)

---

### What you get

Each TikTok video is saved as one row with full metadata:

- **videoId** and **url** — the direct link to the video.
- **description** — the full caption text.
- **postedAt** and **durationSec** — post date and clip length.
- **playCount** (views), **likeCount**, **commentCount**, **shareCount**, **saveCount** — complete engagement metrics, overflow-safe even in the millions.
- **hashtags** — every hashtag on the video.
- **music** — the sound's `id`, `title` and `author`.
- **coverUrl**, **width**, **height** — cover image and dimensions.
- **author** — `username`, `nickname`, `verified` flag and **followerCount**.
- **foundForTerm** — which hashtag or keyword surfaced this video.
- **scrapedAt** — capture timestamp.

Export to **CSV, JSON, Excel or HTML**, or pull the data through the **Apify API and webhooks**.

---

### Use cases

- **Trend research** — see which videos, sounds and formats are winning a hashtag.
- **Content & competitor analysis** — benchmark the top-performing posts in your niche.
- **Dataset building** — assemble labelled TikTok datasets for analytics or ML.
- **Creator scouting** — spot rising authors riding a hashtag before they blow up.
- **Ad & creative inspiration** — study the hooks and CTAs that convert in your space.

---

### How to use

1. Add **terms** — hashtags or keywords (the leading `#` is optional). Add several to pull thousands of videos in one run.
2. Set **maxVideosPerTerm** to control how deep each term goes.
3. Choose **sortBy**: `relevance`, `views`, `likes` or `recent`.
4. (Optional) Set a **minViews** floor and toggle **onlyVerifiedAuthors** to cut noise; set a global **maxResults** cap.
5. Click **Start** and export.

#### Example input

```json
{
  "terms": ["#booktok", "book recommendations", "#readingtips"],
  "maxVideosPerTerm": 200,
  "sortBy": "views",
  "minViews": 50000
}
````

#### Example output

```json
{
  "videoId": "7600000000000000000",
  "url": "https://www.tiktok.com/@rose_0708/video/7600000000000000000",
  "description": "my fav reads this month 📚 #booktok",
  "postedAt": "2026-02-20T09:12:00.000Z",
  "durationSec": 22,
  "width": 576,
  "height": 1024,
  "coverUrl": "https://p16-sign.tiktokcdn.com/...",
  "playCount": 11100000,
  "likeCount": 2100000,
  "commentCount": 8400,
  "shareCount": 30200,
  "saveCount": 410000,
  "hashtags": ["booktok", "book", "fyp"],
  "music": { "id": "72...", "title": "original sound", "author": "rose" },
  "author": { "username": "rose_0708", "nickname": "rose", "verified": false, "followerCount": 2859 },
  "foundForTerm": "booktok",
  "scrapedAt": "2026-06-03T18:00:00.000Z"
}
```

***

### FAQ

#### Does this need a TikTok login or API key?

No. The actor reads only public video data through residential proxies — no account, no cookies, no API key, and zero ban risk.

#### Should I use a hashtag or a keyword?

Both work, and you can mix them. Drop the `#` or keep it — the actor handles either. Keywords cast a wider net; hashtags are more precise.

#### How do I get the top-performing videos?

Set `sortBy` to `views` (or `likes`) and add a `minViews` floor to keep only the high performers.

#### How many videos can I pull?

Thousands. Add more terms and raise `maxVideosPerTerm`. Results are de-duplicated automatically across terms, so a video matching two tags is saved once.

#### Is this a TikTok unofficial API or API alternative?

Yes. It works as a no-API-key TikTok scraper and unofficial API alternative — feed it hashtags or keywords and pull structured video data without TikTok's official API or developer access.

#### How do I export TikTok hashtag data to CSV or JSON?

Run the scraper, then download the dataset as CSV, JSON, Excel or HTML, or pull it through the Apify API and webhooks. Every video row carries views, likes, sound and author fields ready for analysis.

#### Can I scrape TikTok by keyword without login?

Yes. The actor scrapes TikTok by hashtag or keyword with no login, no cookies and no API key, returning the same engagement-rich video dataset either way.

***

### Pairs well with

- **TikTok Sound & Music Video Scraper** — drill into the sounds powering a trend.
- **TikTok Creator Lead Finder** — turn the authors into outreach leads.

***

> **Responsible use.** This actor collects publicly available video data only. You are responsible for complying with TikTok's Terms and all applicable laws.

### Changelog

#### 2026-06-07

- Docs: added coverage for TikTok unofficial API alternative, exporting TikTok hashtag data to CSV/JSON, and scraping TikTok by keyword without login.

#### 2026-06-05

- Reliability fix: results are no longer dropped by strict output validation — runs now complete cleanly even at high volume (thousands of results).
- Stability & performance hardening; fresh rebuild.

#### 2026-06-04

- Verified live & refreshed build — reliability/maintenance pass.

# Actor input Schema

## `terms` (type: `array`):

Hashtags or keywords to harvest videos for. The leading # is optional. Add many to collect thousands of videos. Examples: \['#cooking', 'morning routine', '#booktok'].

## `maxVideosPerTerm` (type: `integer`):

How many videos to collect per hashtag/keyword.

## `sortBy` (type: `string`):

Order videos within each term before saving.

## `minViews` (type: `integer`):

Only keep videos with at least this many views. 0 = no minimum.

## `onlyVerifiedAuthors` (type: `boolean`):

Keep only videos posted by verified accounts.

## `maxResults` (type: `integer`):

Global cap on videos saved across all terms. 0 = unlimited.

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

TikTok requires residential proxies. Leave the default (Apify Proxy · RESIDENTIAL group).

## Actor input object example

```json
{
  "terms": [
    "#cooking",
    "morning routine",
    "#booktok"
  ],
  "maxVideosPerTerm": 30,
  "sortBy": "relevance",
  "minViews": 0,
  "onlyVerifiedAuthors": false,
  "maxResults": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `foundForTerm` (type: `string`):

Hashtag/keyword

## `description` (type: `string`):

Video caption

## `playCount` (type: `string`):

Play count

## `likeCount` (type: `string`):

Like count

## `postedAt` (type: `string`):

Post date

## `url` (type: `string`):

Video URL

# 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 = {
    "terms": [
        "#cooking"
    ],
    "maxVideosPerTerm": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/tiktok-hashtag-video-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 = {
    "terms": ["#cooking"],
    "maxVideosPerTerm": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "terms": [
    "#cooking"
  ],
  "maxVideosPerTerm": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call logiover/tiktok-hashtag-video-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/tiktok-hashtag-video-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Hashtag Scraper - Scrape Videos by Tag",
        "description": "Scrape TikTok by hashtag or keyword, no API key. Export TikTok video data to CSV/JSON with views, likes, sound & author. A TikTok unofficial API.",
        "version": "1.0",
        "x-build-id": "EMJelqe8PCm4waOck"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~tiktok-hashtag-video-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-tiktok-hashtag-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~tiktok-hashtag-video-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-tiktok-hashtag-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~tiktok-hashtag-video-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-tiktok-hashtag-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "terms"
                ],
                "properties": {
                    "terms": {
                        "title": "Hashtags / keywords",
                        "type": "array",
                        "description": "Hashtags or keywords to harvest videos for. The leading # is optional. Add many to collect thousands of videos. Examples: ['#cooking', 'morning routine', '#booktok'].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxVideosPerTerm": {
                        "title": "Max videos per term",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many videos to collect per hashtag/keyword.",
                        "default": 150
                    },
                    "sortBy": {
                        "title": "Sort output by",
                        "enum": [
                            "relevance",
                            "views",
                            "likes",
                            "recent"
                        ],
                        "type": "string",
                        "description": "Order videos within each term before saving.",
                        "default": "relevance"
                    },
                    "minViews": {
                        "title": "Min views",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only keep videos with at least this many views. 0 = no minimum.",
                        "default": 0
                    },
                    "onlyVerifiedAuthors": {
                        "title": "Only verified authors",
                        "type": "boolean",
                        "description": "Keep only videos posted by verified accounts.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Global cap on videos saved across all terms. 0 = unlimited.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "TikTok requires residential proxies. Leave the default (Apify Proxy · RESIDENTIAL group).",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
