# Douyin Feed Scraper (`toolzerhub/douyin-feed-scraper`) Actor

Collect what Douyin is recommending right now: the guest home feed, or a category feed for food, gaming, knowledge, anime, music, short drama, or any channel by ID. Every row returns the caption, publish date, duration, stats, author, and sound. No Douyin login or account required.

- **URL**: https://apify.com/toolzerhub/douyin-feed-scraper.md
- **Developed by:** [ToolzerHub](https://apify.com/toolzerhub) (community)
- **Categories:** Social media, Automation, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Douyin Feed Scraper

Collect what Douyin is recommending right now: the guest home feed, a named category feed (food, gaming, knowledge, anime, music), any other channel by its `tag_id`, or the short-drama discovery feed. No Douyin login or account required. Pick a mode with `scraperType`.

### Modes

| `scraperType` | Feed |
|---|---|
| `feedHome` (default) | Guest home recommendation feed |
| `feedFood`, `feedGame`, `feedKnowledge`, `feedAnime`, `feedMusic` | Named category feeds |
| `feedChannel` | Any other category feed, by `tag_id` |
| `feedSeries` | Short-drama (短剧) discovery feed |

### Input

| Field | Use it for |
|---|---|
| **`tag_id`** | Channel ID for `feedChannel`. Required only for that mode — the food channel, for example, is `300203`. |
| **`series_content_type`** | `feedSeries` only. Integer `0`–`10`, default `0`; different values return different sets of series. |
| **`maxItems`** | Caps the run. Default `100`. Set `0` for no limit. |

```json
{
  "scraperType": "feedChannel",
  "tag_id": "300203",
  "maxItems": 50
}
```

### Output

| Field | Mode | Contents |
|---|---|---|
| **`aweme_id`**, **`desc`**, **`create_time`**, **`duration`**, **`statistics`**, **`author`**, **`music`**, **`share_url`** | The seven video feeds | Each recommended video |
| **`series_id`**, **`series_name`**, **`series_stats`**, **`series_status`**, **`cover`**, **`author`**, **`aweme_id`** | `feedSeries` | Each recommended series and its current episode |

```json
{
  "aweme_id": "7669645030730091791",
  "desc": "《越狱》深度解析 第21期丨 500万巨款引发全员狂飙！",
  "create_time": 1785729198,
  "statistics": { "digg_count": 11007, "comment_count": 167, "share_count": 337, "collect_count": 1416 }
}
```

### Questions

**Why do I see the same videos again if I run this twice, or across pages in one run?**
These feeds have no stable pagination — Douyin's recommendation ranking shifts between requests, so sequential pages genuinely overlap. Within one run, the Actor dedupes on `aweme_id` and stops once a full page brings back nothing new. Across separate runs there is no such guard: the feed itself repeats rather than advancing like a normal list, so a second run later the same day will still return some of the same videos.

**Is `feedSeries` the same underneath?**
No. The seven video feeds page on an internal counter with no proper end signal, which is what makes the overlap above happen. `feedSeries` is a different shape — it pages cleanly on an offset with its own end-of-list flag, so it does not share that overlap behaviour to the same degree.

**Where do I find a `tag_id` for `feedChannel` beyond the five named feeds?**
Douyin doesn't publish a directory of them. `300203` (food) is a known example; beyond the five named category feeds this Actor already covers, a channel ID has to come from elsewhere — a URL you already have, or another source that references it.

### Related Actors

| Actor | Purpose |
|---|---|
| [Douyin Short Drama Scraper](https://apify.com/toolzerhub/douyin-collection-scraper) | Found a series\_id in `feedSeries`? Get its full detail and every episode in order |
| [Douyin Search Scraper](https://apify.com/toolzerhub/douyin-search-scraper) | Looking for specific content rather than what's currently recommended? Search by keyword instead |
| [Douyin Hot Search Scraper](https://apify.com/toolzerhub/douyin-hot-search-scraper) | Ranked trending terms and charts, rather than a raw video feed |

### Support

Questions, bugs, or feature requests: **contact@toolzerhub.com**

Browse the rest: [apify.com/toolzerhub](https://apify.com/toolzerhub)

# Actor input Schema

## `scraperType` (type: `string`):

Choose the dataset for this run.

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

Maximum rows to save. Set 0 to keep collecting until the source is exhausted.

## `tag_id` (type: `string`):

Only needed for a channel that isn't already covered by one of this domain's named feeds (Food, Gaming, Anime, Music, Knowledge). Douyin doesn't show this number publicly.

## `series_content_type` (type: `integer`):

Only keep this kind of short-drama series.

## Actor input object example

```json
{
  "scraperType": "feedHome",
  "maxItems": 20,
  "series_content_type": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Every record collected during this run

# 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 = {
    "maxItems": 20,
    "tag_id": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("toolzerhub/douyin-feed-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 = {
    "maxItems": 20,
    "tag_id": "",
}

# Run the Actor and wait for it to finish
run = client.actor("toolzerhub/douyin-feed-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 '{
  "maxItems": 20,
  "tag_id": ""
}' |
apify call toolzerhub/douyin-feed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,toolzerhub/douyin-feed-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/JmovUWW9JLm7e5MWs/builds/JMUamiLZoR0DwkSLH/openapi.json
