# TikTok Scraper (`akatra/tiktok-scraper`) Actor

Scrape public TikTok accounts (bio, followers, likes), each account's newest videos, single video links with full stats, and a hashtag's top videos. Up to 10 videos per account or hashtag. No login. No comments, no search, no follower lists.

- **URL**: https://apify.com/akatra/tiktok-scraper.md
- **Developed by:** [Akatra](https://apify.com/akatra) (community)
- **Categories:** Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 video or profiles

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: public accounts, newest videos, single videos and hashtag top videos

Get **public TikTok data without logging in**: the account record (name, bio, followers, likes, video count), the newest videos of an account, the full record of any video link (plays, likes, comments, shares, saves, hashtags, music, cover, author), and the top videos of a hashtag. Clean JSON, CSV or Excel, no login and no API key. Run it on a schedule with **only-new monitoring** and **filters** (views, likes, comments, dates, language, hashtag).

**What it can and cannot do, read this first.** TikTok shows only a short list of videos to visitors who are not logged in, and this scraper uses only that public view. So you get **the 10 newest videos per account** (a pinned video that is older than those 10 is not returned) and **about 10 top videos per hashtag**, not whole accounts and not whole hashtag feeds. There is **no keyword search, no sound or music pages, no comments, no follower or following lists**, and no content of private accounts. Large counts are **rounded by TikTok** for logged-out visitors (see Good to know). If you need more than 10 videos of an account or exact view counts, this Actor is not the right tool. If you have the video links, you can get the full record of every one of them with no fixed limit.

**Pay per result** · **No login, no API key** · **Public data only** · **Tested daily** · **LLM-ready JSON for AI agents (MCP)**

### 🛠️ What does TikTok Scraper do?

- 👤 **Account records.** Username, display name, bio, verified badge, followers, following, total likes, number of videos, avatar, the link in the bio and whether the account is private.
- 🎬 **The 10 newest videos of an account.** Each video is a full record, not just a link, and pinned videos are marked.
- 🔗 **Video links.** Paste video links or video numbers and get the full record of each public video, with no fixed limit on how many.
- \#️⃣ **Hashtags, about 10 top videos per hashtag.** The videos TikTok shows to visitors on the public hashtag page, as full records.
- 🔔 **Only-new monitoring.** Turn on `onlyNew` and a scheduled run saves only videos that earlier runs have not delivered yet, so you pay once per video.
- 🎯 **Filters.** Minimum views, likes and comments, a date range, language and hashtag. They are applied by this Actor after each video is loaded, not by TikTok, and videos they leave out are not saved or charged.
- 🔒 **No personal lists.** Comments, comment authors and follower lists are never collected. Email addresses and phone numbers written in bios and video descriptions are masked.
- 🛡️ **Built to get through blocking.** Requests go out with a real browser fingerprint through rotating proxies, and a blocked request is retried from a fresh IP. A result that could not be completed is never charged.

#### What people use it for

- **Creator and brand research.** Compare followers, likes, plays and posting dates of accounts in one table.
- **Competitor and campaign tracking.** Check the latest posts of a brand or a list of creators every day with a schedule.
- **Hashtag and trend spotting.** See which videos TikTok currently shows for a hashtag, with play and like counts.
- **Video stats from a list of links.** Turn a list of video links from a spreadsheet into plays, likes, comments, shares and saves.
- **Datasets for AI and analytics.** Feed account and video records to dashboards, RAG pipelines or agents.

### 📊 What data can you extract?

The dataset holds two kinds of records, told apart by the `type` field.

**Account record (`type: "profile"`)**

| Field | Meaning |
|---|---|
| `username`, `displayName`, `url` | The account's username, display name and link |
| `bio` | Bio text (email addresses and phone numbers masked) |
| `verified` | Whether the account has the verified badge |
| `followers`, `following`, `likes`, `videoCount` | Follower, following, total like and video counts |
| `avatarUrl` | Avatar image link (signed and temporary) |
| `bioLink` | The link the account shows in its bio, when it has one |
| `isPrivate` | `true` for private accounts. Only this record is saved for them, no videos |
| `region` | The account's region when TikTok shows it, otherwise `null` |
| `scrapedAt` | When the record was read (UTC) |

**Video record (`type: "video"`)**

| Field | Meaning |
|---|---|
| `id`, `url` | The video number and its link |
| `description` | Caption (email addresses and phone numbers masked). @mentions stay in the text. For a video that replies to a comment, the leading `Replying to @name` is removed, because that name belongs to the person who wrote the comment |
| `createdAt` | When the video was posted (UTC) |
| `durationSeconds` | Length of the video |
| `playCount`, `likeCount`, `commentCount`, `shareCount`, `collectCount` | Plays, likes, comments, shares and saves. Only the numbers, never the comments. TikTok rounds large values for logged-out visitors (see Good to know) |
| `hashtags` | Hashtags used in the caption, in order |
| `music` | Sound used: `id`, `title`, `author` (same as `authorName`), `authorName`, `isOriginal` |
| `coverUrl`, `videoUrl` | Cover image link and video file link (both signed; `videoUrl` usually cannot be downloaded outside the session that loaded it, see Good to know) |
| `isAd`, `locationCreated` | Whether TikTok marks it as an ad, and the country code where it was created |
| `isPinned` | `true` or `false` for videos read from an account (pinned to the top of the profile), `null` for video links and hashtags |
| `isPhotoPost` | `true` for photo posts (slideshows): they have `videoUrl` `null` and `durationSeconds` 0 |
| `authorUsername`, `authorDisplayName`, `authorVerified`, `authorFollowers` | The creator of the video. `authorFollowers` is exact for videos read from an account and rounded to 3 significant digits otherwise |
| `metrics` | The same four numbers in one place: `views`, `likes`, `comments`, `shares` (same values as `playCount`, `likeCount`, `commentCount`, `shareCount`) |
| `thumbnail`, `mediaUrl` | Same values as `coverUrl` and `videoUrl` |
| `language` | Language TikTok states for the caption, such as `en`. `null` when TikTok does not say (videos read from the lighter fallback page carry none) |
| `scrapedAt` | When the record was read (UTC) |

A field TikTok does not show is `null`.

### 🚀 How to use TikTok Scraper

1. Create a free [Apify](https://apify.com) account and open this Actor.
2. Add **profiles** (usernames such as `nike` or links such as `https://www.tiktok.com/@nike`), **video links**, **hashtags**, or any mix of the three.
3. Choose how many of the newest videos to save per profile (0 to 10) and how many videos per hashtag (1 to 10). Use 0 for profiles when you only want the account records. A higher number for profiles is treated as 10 and the run status says so.
4. Optional: turn on **Only new videos** for scheduled monitoring and set filters (see below).
5. Run it and download the results as JSON, CSV or Excel, or read them through the API.

### 📥 Input example (JSON)

```json
{
  "profiles": ["nike", "https://www.tiktok.com/@adidas"],
  "maxVideosPerProfile": 10,
  "videoUrls": ["https://www.tiktok.com/@nike/video/7691822999523101966"],
  "hashtags": ["running"],
  "maxVideosPerHashtag": 10
}
```

Monitoring a brand every day, with filters:

```json
{
  "profiles": ["nike"],
  "onlyNew": true,
  "minViews": 10000,
  "dateFrom": "2026-10-01",
  "language": "en"
}
```

### 🔔 Only-new monitoring and filters

**Only new videos (`onlyNew`, off by default).** The first run saves everything it finds. Later runs skip videos that an earlier run already delivered and do not even load their pages. The memory is kept per profile, per hashtag and for video links, in a storage named `akatra-tiktok-seen` in your account, so it survives between scheduled runs. Account records are saved on every run, because follower counts change.

**Filters.** They are applied by this Actor after a video is loaded. TikTok does not filter anything for us, and a video that fails a filter is not saved and not charged. A video that fails a filter is also **not remembered** by `onlyNew`: if it passes the filter on a later run (for example its views rise above `minViews`) and it is still among the visible videos, it is saved then.

| Input | What it does |
|---|---|
| `minViews`, `minLikes`, `minComments` | Keep videos with at least this many views, likes or comments (the numbers, not the comments). Counts are rounded by TikTok for large values |
| `dateFrom`, `dateTo` | Keep videos posted from and until these dates (UTC), for example `2026-10-01`. `dateTo` includes the whole day |
| `language` | A code such as `en` or `tr`. Videos whose language TikTok states and that differs are left out. **Videos with no known language are kept**, they are never dropped automatically |
| `hashtag` | Keep videos whose caption contains this hashtag |

Only a value that is known and does not match removes a video; an unknown value (`null`) never does.

Note that profiles and hashtags still give at most 10 videos each, so filters narrow those 10, they do not find more. There is no keyword search and no comment scraping.

### 📤 Sample output (JSON)

![Sample output table of TikTok Scraper](https://api.apify.com/v2/key-value-stores/GkJnrNz6YWKHQYnZr/records/tiktok-scraper-output.png)

Account record:

```json
{
  "type": "profile",
  "username": "nike",
  "displayName": "Nike",
  "bio": "Just Do It.",
  "verified": true,
  "followers": 9261587,
  "following": 91,
  "likes": 49356968,
  "videoCount": 1088,
  "avatarUrl": "https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-avt-0068/e0b0ac7b6ad6447a8e923fd1eb162f2c~tplv-tiktokx-cropcenter:1080:1080.jpeg?...",
  "bioLink": "http://empli.fi/niketiktok",
  "isPrivate": false,
  "region": null,
  "url": "https://www.tiktok.com/@nike",
  "scrapedAt": "2026-10-02T20:00:42+00:00"
}
```

Video record:

```json
{
  "type": "video",
  "id": "7692117332725910814",
  "url": "https://www.tiktok.com/@nba/video/7692117332725910814",
  "description": "The back and forth was insane 😳🤯 #NBA #basketball #Bucks #Hawks #FantasticFinish",
  "createdAt": "2026-10-02T17:04:13+00:00",
  "durationSeconds": 115,
  "playCount": 19600,
  "likeCount": 1857,
  "commentCount": 21,
  "shareCount": 6,
  "collectCount": 54,
  "hashtags": ["nba", "basketball", "bucks", "hawks", "fantasticfinish"],
  "music": {"id": "7692117422404373279", "title": "original sound", "authorName": "NBA", "isOriginal": true},
  "coverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ooR9OMIAUOAFCEe5FyGBnffKAQDyQJAQxAAqwf~tplv-tiktokx-dmt-logom:tos-useast8-i-0068-tx2/o0yGifIF6AVFwfUARegZ5TAIGeAZLQAKOJAq8Q.image?...",
  "videoUrl": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c003-tx2/ocuMvgUGqF5eECQLIvc8IAQ5RQ6fefwAAGIKlP/?...",
  "isAd": false,
  "isPinned": false,
  "isPhotoPost": false,
  "locationCreated": "US",
  "authorUsername": "nba",
  "authorDisplayName": "NBA",
  "authorVerified": true,
  "authorFollowers": 27229491,
  "scrapedAt": "2026-10-02T20:33:18+00:00"
}
```

Image and video links are shortened here; the real values carry TikTok's signature.

### 🤖 Use it with AI agents, MCP and the API

The output is clean JSON with stable field names, ready for LLM pipelines, RAG and agent tools without extra parsing.

- **AI agents and MCP (Claude, ChatGPT, Cursor and others).** Add the Apify MCP server with this Actor as a tool: `https://mcp.apify.com?tools=akatra/tiktok-scraper`. The agent can then run it and read the results by itself.
- **API.** Start a run and get the results in a single call:

```bash
curl -X POST "https://api.apify.com/v2/acts/akatra~tiktok-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profiles": ["nike"], "maxVideosPerProfile": 10, "hashtags": ["running"], "maxVideosPerHashtag": 10}'
```

- **No-code tools and SDKs.** Works with Make, n8n, Zapier and LangChain through Apify's integrations, and with the Apify clients for Python and JavaScript. Schedule it and send the results to a webhook, Google Sheets or your own database.

### 💰 Pricing: pay per result

You pay per record returned, an account or a video. See the price on the Pricing tab. Accounts and videos that are not found, private videos and videos whose details could not be loaded are not saved and not charged. Runs that return nothing cost only a tiny start fee. There is no subscription or rental fee. New to Apify? The free plan includes $5 of platform credit every month, enough for about 5,000 videos or profiles with this Actor, and no credit card is needed.

### 🚦 Run status and error messages

Every run ends with a plain status message, so automated workflows (API, Make, n8n, AI agents) can tell what happened without reading the log:

| Situation | What you get |
|---|---|
| Finished normally | `Saved N records (A accounts, B videos).` When you ask for more than 10 videos per profile it adds `Max videos per profile was capped at 10: …` (the same for hashtags). Filtered and already delivered videos are counted in the message. |
| Filters or only-new left nothing | The run succeeds with `No new records matched.` followed by how many videos did not match your filters and how many were skipped as already delivered. |
| Nothing saved | The run succeeds with `No records saved. Check the usernames, video links and hashtags, or try again later.` You pay only the start fee. |
| Missing or unsupported input | The run fails at once with `Invalid input: …` naming the value to fix. Nothing is scraped. |
| Account, video or hashtag not found, or not public | `Not found or not public: @name, #tag, video 123.` The rest of the run continues. |
| Private account | The account record is saved and the message says `Private accounts saved without videos: name.` |
| A list could not be loaded | `Could not load: @name videos.` The account record is still saved. |
| Details of some videos could not be loaded | `N videos skipped because their details could not be loaded (not charged).` |
| TikTok could not be reached at all | The run fails with `Could not load results from TikTok. Please try again; if it keeps failing, open an issue.` Nothing is charged. |
| Your maximum charge is reached | Stops cleanly with `Stopped at your maximum charge limit.` Everything saved so far stays in the dataset. |

### ℹ️ Good to know

- **Limits again, in short:** the 10 newest videos per account and about 10 per hashtag. No search, no comments, no follower lists, no sounds, no private content.
- **Account videos are the newest ones, newest first.** TikTok lists pinned videos at the top of an account, so the scraper sorts by posting date before it cuts the list. Your newest N always come first; a pinned video is returned only when it is among them, and then `isPinned` is `true`. A pinned video that is newer than every video after it in TikTok's list cannot be told apart from a normal one and shows `isPinned` `false`. Hashtag videos are the top videos TikTok shows for the tag, not the newest, and the selection can change between runs.
- **Counts are rounded by TikTok.** For visitors who are not logged in, TikTok rounds large `playCount`, `likeCount` and similar numbers (values above about 10,000 come back as figures like 2500000 or 76500000) and `authorFollowers` to 3 significant digits. Small numbers are exact. For videos read from an account, `authorFollowers` is replaced by the exact follower count from the account record. The account record's own `followers`, `following`, `likes` and `videoCount` are exact.
- A video link can be `https://www.tiktok.com/@user/video/123...`, a `m.tiktok.com/v/123.html` link or just the video number. Short `vm.tiktok.com` links are not supported.
- A video that appears twice in a run (for example in a profile and in a hashtag) is saved once.
- `collectCount` (saves) comes from the video's own page. When TikTok does not serve that page to us, the video is read from its lighter embed page instead. For those videos `collectCount` is `null` and the other counts are rounded more coarsely. All other fields stay filled.
- **Photo posts** (slideshows) are returned too, with `isPhotoPost` `true`, `videoUrl` `null` and `durationSeconds` 0.
- `videoUrl` is tied to the session that loaded the page and usually cannot be downloaded from elsewhere. `coverUrl` and `avatarUrl` work for about two days.
- Counts are a snapshot of the moment the page was read, so they differ a little from run to run. The account's `likes` is the total like count TikTok shows on the profile.
- Pages are large (300 to 400 KB each) and TikTok sometimes answers with a challenge page or an overload message. The scraper then renews the IP and tries again. Datacenter proxies are used by default. If requests keep failing, choose residential proxies in the Proxy setting.
- If you set a maximum charge for a run, the scraper stops as soon as that limit is reached.
- **Privacy:** only public account and video data is collected. Comments, comment authors and follower or following lists are never read. Email addresses and phone numbers in bios and descriptions are masked as `[email removed]` and `[phone removed]`.

### 📝 Changelog

- **2026-10-02** First release: account records, the 10 newest videos of an account (pinned videos marked), video links, hashtag top videos (about 10).

- **2026-10-03** Added `onlyNew` monitoring, filters (`minViews`, `minLikes`, `minComments`, `dateFrom`, `dateTo`, `language`, `hashtag`) and the standard fields `metrics`, `thumbnail`, `mediaUrl`, `language`. All earlier fields are unchanged.

### ⚖️ Legal and privacy

This scraper is an independent tool and is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance. TikTok is a trademark of its owner and is used here only to describe which website the tool works with. Use the data in line with the laws that apply to you and the source site's terms.

The source site's name and logo are trademarks of their owner and appear here only to identify the website this tool works with. The Actor reads only pages that are public without logging in. How you store and use the data is your responsibility: follow the laws that apply to you, such as GDPR and CCPA.

### 🔗 More scrapers from Akatra

- [Indeed Jobs Scraper](https://apify.com/akatra/indeed-jobs-scraper): 💼 job ads from Indeed in 30 countries, with yearly salary and only-new mode.
- [Google News Scraper](https://apify.com/akatra/google-news-scraper): 📰 news by keyword or topic in 50 editions, with the real article URLs.
- [Google Trends Scraper](https://apify.com/akatra/google-trends-scraper): 📈 interest over time, by region, and rising related queries.
- [Google Ads Transparency Scraper](https://apify.com/akatra/google-ads-transparency-scraper): 🔎 every ad a company runs on Google, with regions and dates.
- [Airbnb Listings Scraper](https://apify.com/akatra/airbnb-listings-scraper): 🏠 Airbnb listings with prices, ratings and map coordinates.
- [YouTube Transcript Scraper](https://apify.com/akatra/youtube-transcript-scraper): 🎬 video transcripts as clean text and timestamped lines.

### 💬 Support

Found a bug or need a field that is missing? Open an issue on the Issues tab and we usually reply within a day.

# Actor input Schema

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

TikTok usernames or profile links, one per line, for example 'nike', '@nike' or https://www.tiktok.com/@nike. Each profile gives one account record plus its newest videos (up to 10).

## `videoUrls` (type: `array`):

Links of single videos, one per line, for example https://www.tiktok.com/@nike/video/7691822999523101966. Each link gives the full video record. Short vm.tiktok.com links are not supported.

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

Hashtags without or with '#', one per line, for example 'running'. TikTok shows about 10 top videos per hashtag to logged-out visitors, so that is the most you get per hashtag.

## `maxVideosPerProfile` (type: `integer`):

How many of the newest videos to save for each profile. TikTok's public pages show logged-out visitors only the 10 newest videos of an account, so 10 is the most you can get; a higher number is treated as 10 and the run status says so. Pinned videos are included only when they are among your newest N. Use 0 to save only the account records.

## `maxVideosPerHashtag` (type: `integer`):

How many top videos to save for each hashtag. TikTok's public pages show logged-out visitors at most about 10, so 10 is the maximum.

## `onlyNew` (type: `boolean`):

Save only videos that an earlier run of this Actor has not already delivered, for scheduled monitoring. The first run saves everything it finds. Videos that your filters leave out are not remembered, so they can still come back later. Account records are saved on every run. Off by default.

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

Save only videos with at least this many views. Applied by this Actor after the video is loaded, not by TikTok.

## `minLikes` (type: `integer`):

Save only videos with at least this many likes. Applied by this Actor after the video is loaded, not by TikTok.

## `minComments` (type: `integer`):

Save only videos with at least this many comments (the number, not the comments themselves). Applied by this Actor after the video is loaded, not by TikTok.

## `dateFrom` (type: `string`):

Save only videos posted on or after this date (UTC), for example 2026-10-01. Applied by this Actor after the video is loaded, not by TikTok.

## `dateTo` (type: `string`):

Save only videos posted on or before this date (UTC), for example 2026-10-31. Applied by this Actor after the video is loaded, not by TikTok.

## `language` (type: `string`):

Language code such as 'en' or 'tr'. Videos whose language TikTok states and that differs are left out; videos with no language information are kept (hashtag and video pages from the fallback source carry none). Applied by this Actor, not by TikTok.

## `hashtag` (type: `string`):

Save only videos whose description contains this hashtag, with or without '#', for example 'running'. Applied by this Actor, not by TikTok.

## Actor input object example

```json
{
  "profiles": [
    "nike"
  ],
  "maxVideosPerProfile": 10,
  "maxVideosPerHashtag": 10,
  "onlyNew": false
}
```

# Actor output Schema

## `records` (type: `string`):

All scraped accounts and videos, shown in the overview table.

## `recordsFull` (type: `string`):

All scraped records with every field.

# 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": [
        "nike"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,akatra/tiktok-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/u7711WAuZwkUxJoLW/builds/dGaVM3nJKTOV3vywm/openapi.json
