# TikTok Scraper & API | EveryInfra (`blushing_parachute/everyinfra-tiktok-api`) Actor

TikTok data via one Actor: search, profile, user_videos, video, comments, hashtag, followers, transcript, shop_search, shop_creator. Pay per request, no start fee. First 3 requests free across EveryInfra Actors.

- **URL**: https://apify.com/blushing_parachute/everyinfra-tiktok-api.md
- **Developed by:** [ECHO](https://apify.com/blushing_parachute) (community)
- **Categories:** Social media, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 search requests

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/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 & API | EveryInfra

Search TikTok videos, hashtags, user profiles and shop items to retrieve transcripts, comments and ecommerce metrics.

Use a valid TikTok video URL for transcripts. Comments give top-level entries with a few replies, not full conversation trees.

### Actions

| Action | What you get | Required | Optional | Results per request | Price per request |
|---|---|---|---|---|---|
| `search` | Search TikTok by keyword across the video, account or top tab. Get caption, author and like, comment, share and view counts. Choose the tab with `content_type`. Results are not a complete sample, and the ranking is not explained. | keyword | content_type | 10 (up to 200) | $0.0014 |
| `profile` | Look up a TikTok account by handle. Get its bio, external link, follower, following, like, video and friend counts, and creation date. Use the handle with or without @, not a profile URL or a Douyin secUid. Private analytics are not included. | username | — | 1 | $0.0014 |
| `user_videos` | List a TikTok creator's videos with caption, publish time and like, comment, share and view counts. Filter with `min_likes`, cap the publish date with `until`, or `sort` by newest, oldest or popular. Drafts and private posts are not included. | username | min_likes, sort, until | 10 (up to 50) | $0.0017 |
| `video` | Fetch one TikTok video's caption, author, publish time and like, comment, share and view counts from its URL. Comments and the transcript have their own actions, and no metric history is kept. | url | — | 1 | $0.0016 |
| `comments` | Read the comments on a TikTok video. Get likes, reply counts, reply links and whether the creator liked or pinned each one. Each top-level comment brings at most two replies. So the full conversation tree is not guaranteed. | url | — | 20 (up to 200) | $0.0019 |
| `hashtag` | Browse TikTok videos posted under a hashtag. Each video has caption, creator and like, comment, share and view counts. Pass the tag with or without #. It is not a general text query and does not measure the total volume or trend of the tag. | hashtag | — | 10 (up to 30) | $0.0017 |
| `followers` | Check a TikTok account's follower, following, post and like totals by handle, with a precision flag for rounded numbers. It returns counts, not the names of the people who follow. | username | channel | 1 | $0.0013 |
| `transcript` | Extract the transcript of a TikTok video from its URL. You get full text, plus timestamped segments when they exist. Check `has_transcript` first. Recognizable speech, translation and perfect accuracy are not guaranteed. | url | — | 1 | $0.0008 |
| `shop_search` | Find TikTok Shop products by keyword. Get price, original price, units sold, rating, review count, category and shop name. Set the market with `country`, which defaults to US, and step through results with `page`. Inventory and GMV are not calculated. | keyword | country, page | 20 (up to 100) | $0.0011 |
| `shop_creator` | Size up a TikTok Shop creator by handle. Get categories, followers, video count, promoted products, units sold and average views. `country` picks the Shop market, not the creator's nationality. Private sales, commissions and buyers are not shown. | username | country | 1 | $0.0016 |

### Input

Pick an `action` and fill the fields it uses. Example:

```json
{
  "action": "search",
  "keyword": "espresso"
}
```

Fields that another action needs are ignored when left empty. API users can also pass `{"action": ..., "params": {...}}`.

### Output

Each result is one dataset row. Rows keep every field the source page exposes for that action; a field the platform hides or leaves empty for a record is omitted rather than filled with a placeholder. When there is a next page, the run's `OUTPUT` record holds `next_page_token`.

- `search`: `id`, `url`, `text`, `author_name`, `author_username`, `like_count`, `comment_count`, `share_count`, `view_count`, `posted_at`, `collect_count`, `repost_count`, `duration_sec`, `duration_seconds`, `cover_image_url`, `language`, `country`, `hashtags`, `music`, `is_ad`, `is_pinned`, `is_sponsored`, `is_slideshow`, `has_shop_product`, `author_id`, `author_url`, `author_avatar_url`, `author_bio`, `author_is_verified`, `author_is_private`, `author_is_seller`, `author_follower_count`, `author_following_count`, `author_like_count`, `author_video_count`, `platform`
- `profile`: `user_id`, `username`, `display_name`, `bio`, `url`, `external_url`, `follower_count`, `following_count`, `like_count`, `video_count`, `friend_count`, `is_verified`, `is_private`, `avatar_url`, `created_at`, `platform`
- `user_videos`: `id`, `url`, `text`, `author_name`, `author_username`, `like_count`, `comment_count`, `share_count`, `view_count`, `posted_at`, `collect_count`, `repost_count`, `duration_sec`, `duration_seconds`, `cover_image_url`, `language`, `country`, `hashtags`, `music`, `is_ad`, `is_pinned`, `is_sponsored`, `is_slideshow`, `has_shop_product`, `author_id`, `author_url`, `author_avatar_url`, `author_bio`, `author_is_verified`, `author_is_private`, `author_is_seller`, `author_follower_count`, `author_following_count`, `author_like_count`, `author_video_count`, `platform`
- `video`: `id`, `url`, `text`, `author_name`, `author_username`, `like_count`, `comment_count`, `share_count`, `view_count`, `posted_at`, `collect_count`, `repost_count`, `duration_sec`, `duration_seconds`, `cover_image_url`, `language`, `country`, `hashtags`, `music`, `is_ad`, `is_pinned`, `is_sponsored`, `is_slideshow`, `has_shop_product`, `author_id`, `author_url`, `author_avatar_url`, `author_bio`, `author_is_verified`, `author_is_private`, `author_is_seller`, `author_follower_count`, `author_following_count`, `author_like_count`, `author_video_count`, `platform`
- `comments`: `id`, `text`, `author_username`, `author_id`, `like_count`, `reply_count`, `reply_to_id`, `is_reply`, `liked_by_author`, `pinned_by_author`, `posted_at`, `platform`
- `hashtag`: `id`, `url`, `text`, `author_name`, `author_username`, `like_count`, `comment_count`, `share_count`, `view_count`, `posted_at`, `collect_count`, `repost_count`, `duration_sec`, `duration_seconds`, `cover_image_url`, `language`, `country`, `hashtags`, `music`, `is_ad`, `is_pinned`, `is_sponsored`, `is_slideshow`, `has_shop_product`, `author_id`, `author_url`, `author_avatar_url`, `author_bio`, `author_is_verified`, `author_is_private`, `author_is_seller`, `author_follower_count`, `author_following_count`, `author_like_count`, `author_video_count`, `platform`
- `followers`: `id`, `username`, `url`, `follower_count`, `following_count`, `post_count`, `like_count`, `connection_count`, `precision`, `platform`
- `transcript`: `id`, `url`, `text`, `segments`, `has_transcript`, `platform`
- `shop_search`: `id`, `url`, `name`, `price`, `original_price`, `currency`, `sold_count`, `rating`, `rating_scale`, `review_count`, `category`, `shop_name`, `image_url`, `platform`
- `shop_creator`: `id`, `username`, `url`, `name`, `text`, `avatar_url`, `country`, `categories`, `follower_count`, `video_count`, `product_count`, `sold_count`, `avg_views`, `platform`

### Pricing

Pay per event, charged only when a run delivers data:

- `search`: $0.0014, one event per started block of 10 results.
- `profile`: $0.0014, one event per non-empty request, whatever the row count.
- `user_videos`: $0.0017, one event per started block of 10 results.
- `video`: $0.0016, one event per non-empty request, whatever the row count.
- `comments`: $0.0019, one event per started block of 20 results.
- `hashtag`: $0.0017, one event per started block of 10 results.
- `followers`: $0.0013, one event per non-empty request, whatever the row count.
- `transcript`: $0.0008, one event per non-empty request, whatever the row count.
- `shop_search`: $0.0011, one event per started block of 20 results.
- `shop_creator`: $0.0016, one event per non-empty request, whatever the row count.

Empty or failed requests are never charged. There is no actor-start fee and no per-row fee. Apify platform usage may apply.

### Free trial

The first 3 accepted data requests per Apify account are free across all EveryInfra Actors combined (a lifetime total, not per Actor and not reset). Invalid input does not use a trial; an accepted request that returns no data still does. After that a paid Apify plan is required.

### Notes

- Results reflect what is publicly visible when the run happens; counts can be lower than requested.
- One run makes one request. For more pages, start another run with `page_token` where the action supports it.

### Support

Open an issue on this Actor's Issues tab with the run ID.

# Actor input Schema

## `action` (type: `string`):

What to fetch. Each action uses only the fields listed for it below; other fields are ignored when empty.

## `keyword` (type: `string`):

Used by `search` (required), `shop_search` (required). Specifies the search query string for public video searches in the `search` action. In `shop_search`, this searches TikTok Shop products instead, which draw from a distinct dataset.

## `content_type` (type: `string`):

Used by `search`. Filters results by tab in the `search` action. Allowed values are `video` for videos, `profile` for users, and `top` for top content. Providing this parameter in fixed author, video, or hashtag actions does not guarantee that filtering will take effect, so verify returned response objects and fields after changing tabs.

## `username` (type: `string`):

Used by `profile` (required), `user_videos` (required), `followers` (required), `shop_creator` (required). Public TikTok handle, which may optionally include the leading `@`. Do not supply Douyin `secUid` tokens or full profile URLs. In `followers`, this returns follower counts; in `shop_creator`, it queries creator e-commerce details for a designated market.

## `min_likes` (type: `integer`):

Used by `user_videos`. Numeric threshold filtering videos by minimum like count. It applies to user_videos only and does not filter author follower counts or comment like thresholds.

## `sort` (type: `string`):

Used by `user_videos`. Sorts author video lists in the `user_videos` action. Allowed values are `newest`, `oldest`, and `popular`. It applies to `user_videos` only.

## `until` (type: `string`):

Used by `user_videos`. Sets an upper date bound for video publication time rather than data ingestion time. It applies to user_videos only.

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

Used by `video` (required), `comments` (required), `transcript` (required). Target TikTok video URL required for `video`, `comments`, and `transcript` actions. In `comments`, it retrieves post-level comments where each top-level comment includes at most two replies, without guaranteeing a complete conversation tree.

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

Used by `hashtag` (required). Target hashtag name for the `hashtag` action, with or without the leading `#`. This parameter filters specifically by hashtag and does not function as an arbitrary full-text search term.

## `channel` (type: `string`):

Used by `followers`. Compatibility account handle input for the `followers` action. Precedence is lower than `username`. It is not used for TikTok Shop product searches.

## `country` (type: `string`):

Used by `shop_search`, `shop_creator`. Market region code for `shop_search` and `shop_creator` actions, defaulting to `US` or `us`. It does not filter creator nationality or platform-wide content location. See the catalog for supported markets.

## `page` (type: `integer`):

Used by `shop_search`. 1-based integer page number for `shop_search` product pagination, defaulting to `1`. It does not paginate video comments or author video lists.

## `limit` (type: `integer`):

How many results to request for list actions. Defaults and maximums per action: `search` 10 (max 200); `user_videos` 10 (max 50); `comments` 20 (max 200); `hashtag` 10 (max 30); `shop_search` 20 (max 100). Billing: `search` one event per started block of 10 results; `user_videos` one event per started block of 10 results; `comments` one event per started block of 20 results; `hashtag` one event per started block of 10 results; `shop_search` one event per started block of 20 results.

## `params` (type: `object`):

Optional JSON object with the same fields as above, for API and integration use. Flat fields and params must not disagree.

## Actor input object example

```json
{
  "action": "search",
  "keyword": "espresso"
}
```

# Actor output Schema

## `records` (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 = {
    "keyword": "espresso"
};

// Run the Actor and wait for it to finish
const run = await client.actor("blushing_parachute/everyinfra-tiktok-api").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 = { "keyword": "espresso" }

# Run the Actor and wait for it to finish
run = client.actor("blushing_parachute/everyinfra-tiktok-api").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 '{
  "keyword": "espresso"
}' |
apify call blushing_parachute/everyinfra-tiktok-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,blushing_parachute/everyinfra-tiktok-api"
        }
    }
}
```

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/OEY8HAPluG6OtwK5x/builds/8DVKco9j4sjaKPKEn/openapi.json
