# TikTok Scraper - Profiles, Videos, Hashtags & Search (`dami_studio/tiktok-scraper`) Actor

Scrape TikTok with no login or API key. Pull profiles, videos, hashtags and search in one actor and get views, likes, comments, music, author and video URLs. Export to JSON/CSV/Excel. Cheaper than the 200K-user leader and you never pay for failed runs.

- **URL**: https://apify.com/dami\_studio/tiktok-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (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

$0.25 / 1,000 result returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper — Profiles, Videos, Hashtags & Search (No Login, No API Key)

**Scrape TikTok without a login or API key.** Give it **profiles**, **hashtags**, **search keywords**, or **video URLs** and get back every video with **views, likes, comments, shares**, video & cover URLs, music/sound, author, hashtags and timestamps. Export to **JSON, CSV or Excel**, call it from the **API**, or have results delivered straight to **Notion**. **Just $0.25 per 1,000 results** — built for influencer discovery, trend tracking, lead gen and market research.

> No account. No signing keys. No msToken to paste. Paste a username and run.

### Why this scraper wins

- 🔓 **Keyless, sign-free, proxy-free** — no login, no API key, no signing keys, and **no proxy needed**. It just works.
- 🛡️ **Beats TikTok's IP blocking** — TikTok serves flagged IPs a fake "decoy" profile; this scraper avoids that entirely by never hitting TikTok from a flagged IP, so you always get *real* numbers.
- 💸 **Cheaper** — $0.25 / 1,000 results, billed per result actually returned (empty/failed runs cost nothing).
- 🧹 **Clean, flat records** — one tidy object per video, ready for sheets, dashboards or LLM pipelines.
- 📬 **Built-in Notion delivery** — push every run into Notion via Apify connectors, zero extra code.
- 🚦 **Honest errors** — a clear `errorCode` row when TikTok blocks, instead of silent emptiness.

### What you can scrape

| Mode | Input | Returns |
|---|---|---|
| **Profile** | `profiles` or a profile URL | Profile + its videos |
| **Hashtag** | `hashtags` or a `/tag/` URL | Videos under the hashtag |
| **Search** | `searchQueries` | Videos matching the keyword |
| **Single video** | a `/video/` URL | That video with full stats |

### Input

- **`profiles`** — usernames to scrape (e.g. `nasa`, `nba`).
- **`hashtags`** — hashtags to pull videos from.
- **`searchQueries`** — keywords to search.
- **`startUrls`** — profile / video / tag URLs.
- **`resultsPerPage`** — cap per input (you pay per result).
- **`proxyConfiguration`** — Residential (required; preconfigured).
- **`notionConnector`** — optional Notion delivery.

### Output (one record per video)

```json
{
  "type": "video",
  "id": "7300000000000000000",
  "webVideoUrl": "https://www.tiktok.com/@nasa/video/7300000000000000000",
  "text": "Liftoff! 🚀 #space",
  "createTime": "2024-06-12T14:00:00.000Z",
  "hashtags": ["space"],
  "playCount": 2400000,
  "diggCount": 318000,
  "commentCount": 4200,
  "shareCount": 9100,
  "video": { "duration": 23, "cover": "https://...jpg", "playAddr": "https://...mp4" },
  "music": { "id": "...", "title": "original sound", "authorName": "NASA" },
  "author": { "uniqueId": "nasa", "nickname": "NASA", "verified": true, "secUid": "..." }
}
````

Profile rows include `uniqueId`, `nickname`, `signature`, `followerCount`, `followingCount`, `heartCount`, `videoCount`, `verified`.

### Pricing

**$0.25 per 1,000 results** (pay-per-result). You are only charged for results actually returned.

### FAQ

**Do I need a TikTok account?** No. Public profiles, videos, hashtags and search work keyless.

**Do I need a proxy?** No. This scraper needs no proxy at all — that's a key advantage. It works from any IP.

**How does it beat TikTok's blocking?** TikTok serves flagged IPs a fake decoy profile (e.g. a real account showing 690 followers). This scraper sources data through infrastructure TikTok trusts, so you always get the real numbers.

**It returned an `errorCode` row — why?** That's the actor telling you exactly what happened (`BLOCKED`, `RATE_LIMITED`, `NO_RESULTS`) instead of failing silently.

# Actor input Schema

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

TikTok usernames (with or without @) to scrape — returns the profile plus its recent videos.

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

Hashtags (with or without #) to scrape videos from.

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

Keywords to search TikTok for.

## `startUrls` (type: `array`):

Paste TikTok URLs directly — a profile URL, a /video/ URL (single video), or a /tag/ URL (hashtag).

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

Maximum number of videos/results to collect per profile, hashtag or search. You are charged per result returned.

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

Not required — this scraper needs no proxy. Only add one if you want to distribute requests across IPs at high volume.

## `notionConnector` (type: `string`):

Optional. Deliver the results to your connected Notion via Apify MCP connectors.

## `notionParentId` (type: `string`):

Optional Notion database/data-source id to create the pages in.

## Actor input object example

```json
{
  "profiles": [
    "nasa",
    "nba"
  ],
  "hashtags": [
    "spacex",
    "science"
  ],
  "searchQueries": [
    "rocket launch"
  ],
  "startUrls": [
    "https://www.tiktok.com/@nasa",
    "https://www.tiktok.com/@nasa/video/7300000000000000000"
  ],
  "resultsPerPage": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Scraped profiles and videos are stored in the default dataset (one row each). Blocked/empty/error runs return a single uncharged diagnostic row instead.

# 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 = {
    "profiles": [
        "nasa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/tiktok-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 = { "profiles": ["nasa"] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/tiktok-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 '{
  "profiles": [
    "nasa"
  ]
}' |
apify call dami_studio/tiktok-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Scraper - Profiles, Videos, Hashtags & Search",
        "description": "Scrape TikTok with no login or API key. Pull profiles, videos, hashtags and search in one actor and get views, likes, comments, music, author and video URLs. Export to JSON/CSV/Excel. Cheaper than the 200K-user leader and you never pay for failed runs.",
        "version": "0.1",
        "x-build-id": "8neVu0btKcIF26I7b"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dami_studio~tiktok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dami_studio-tiktok-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/dami_studio~tiktok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dami_studio-tiktok-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/dami_studio~tiktok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dami_studio-tiktok-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",
                "properties": {
                    "profiles": {
                        "title": "Profiles",
                        "type": "array",
                        "description": "TikTok usernames (with or without @) to scrape — returns the profile plus its recent videos.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hashtags": {
                        "title": "Hashtags",
                        "type": "array",
                        "description": "Hashtags (with or without #) to scrape videos from.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Keywords to search TikTok for.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Paste TikTok URLs directly — a profile URL, a /video/ URL (single video), or a /tag/ URL (hashtag).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "resultsPerPage": {
                        "title": "Max videos per input",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum number of videos/results to collect per profile, hashtag or search. You are charged per result returned.",
                        "default": 50
                    },
                    "proxyConfiguration": {
                        "title": "Proxy (optional)",
                        "type": "object",
                        "description": "Not required — this scraper needs no proxy. Only add one if you want to distribute requests across IPs at high volume.",
                        "default": {
                            "useApifyProxy": false
                        }
                    },
                    "notionConnector": {
                        "title": "Notion connector ID (optional)",
                        "type": "string",
                        "description": "Optional. Deliver the results to your connected Notion via Apify MCP connectors."
                    },
                    "notionParentId": {
                        "title": "Notion data-source ID (optional)",
                        "type": "string",
                        "description": "Optional Notion database/data-source id to create the pages in."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
