# YouTube Community Posts Scraper (`parsebird/youtube-community-posts-scraper`) Actor

Scrape YouTube community (posts) tab data by channel URL, @handle, or ID: post text, type, likes, comments, polls, images, and embedded videos. Optional comments, image download, and language detection.

- **URL**: https://apify.com/parsebird/youtube-community-posts-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 posts

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

### YouTube Community Posts Scraper

Scrape the **community posts tab** of any [YouTube](https://www.youtube.com/) channel by URL, `@handle`, or channel ID — post text, type, likes, comments, poll results, images, and embedded videos — with no YouTube API key and no quota limits.

<table><tr>
<td style="border-left:4px solid #FF0000;padding:12px 16px;font-weight:600">
Feed up to 100 channels, get every community post (text, poll, image, video, or shared) with like and comment counts, filter by type, keyword, and date, and optionally pull post comments, download full-resolution images, and detect each post's language — ready for JSON, CSV, or Excel.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Use the Apify actor "parsebird/youtube-community-posts-scraper" via the ApifyClient. Example (Python): from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/youtube-community-posts-scraper").call(run_input={"urls": ["@mkbhd"], "maxPostsPerChannel": 50, "postTypes": "all", "includeComments": False, "downloadImages": False, "detectLanguage": False, "concurrency": 3}); items = list(client.dataset(run["defaultDatasetId"]).iterate_items()). Key inputs: urls (array of channel URLs, @handles, or UC... channel IDs, up to 100), maxPostsPerChannel (integer 1-200, default 50), postTypes ("all" | "text" | "poll" | "image" | "video"), keyword (case-insensitive text filter), dateFrom / dateTo ("YYYY-MM-DD", approximate), includeComments (bool) + maxCommentsPerPost (0-100, default 10), downloadImages (bool), detectLanguage (bool), concurrency (1-5, default 3), proxyConfig. Output fields per post: status, postId, postUrl, postType, channelName, channelId, channelUrl, text, publishedTimeText, likeCount, commentCount, pollChoices, pollTotalVotes, images, videoId, videoTitle, and (optional) comments, detectedLanguage. Full API spec: https://apify.com/parsebird/youtube-community-posts-scraper/api. Get an API token at https://console.apify.com/settings/integrations.
```

### What is YouTube Community Posts Scraper?

**YouTube Community Posts Scraper** extracts every post from a channel's community tab (`youtube.com/@channel/posts`) — the text updates, polls, image drops, and video shout-outs creators publish between uploads. It reads the same public data the YouTube web player renders, so it works as a **YouTube community posts API alternative**: no Google Cloud project, no OAuth, no daily quota.

Add channels as full URLs, `@handles` (like `@mkbhd`), or bare channel IDs (`UCBcRF18a7Qf58cCRy5xuWwQ`). YouTube serves up to roughly 200 posts per channel.

### What can YouTube Community Posts Scraper do?

- 📝 **Every post type** — plain text, polls and quizzes (with choice labels and total votes), single and multi-image posts, posts linking a video or playlist, and shared posts.
- 📊 **Engagement metrics** — exact like count and comment count for each post.
- 🔎 **Filters** — restrict to one post type, require a keyword in the post text, or limit to an approximate publish-date range.
- 💬 **Post comments** *(optional paid add-on)* — scrape up to 100 comments per post, embedded in the post's output row, with author, like count, reply count, and timestamp.
- 🖼️ **Image download** *(optional paid add-on)* — save full-resolution images from image posts to the Apify Key-Value Store and get a direct download URL for each.
- 🌐 **Language detection** *(optional paid add-on)* — add a `detectedLanguage` field (e.g. `eng`, `spa`, `kor`) to every post.
- ⚡ **Parallel channels** — process up to 5 channels at once.
- ☁️ **Runs on Apify** — [schedule](https://docs.apify.com/platform/schedules) recurring runs, call it from the [API](https://docs.apify.com/api/v2), connect it to [integrations](https://apify.com/integrations) (Make, Zapier, n8n, Google Sheets, Slack), and export as JSON, CSV, Excel, or XML.

### What data can you extract from YouTube community posts?

| Field | Description |
|-------|-------------|
| `status` | `"Success"`, or an error message explaining what went wrong for that channel |
| `postId` | Unique post identifier |
| `postUrl` | Direct link to the post |
| `postType` | `text`, `poll`, `image`, `video`, or `shared` |
| `channelName` / `channelId` / `channelUrl` | Channel display name, ID, and URL |
| `text` | Full post text, with shortened links expanded to their real destination |
| `publishedTimeText` | Relative publish time as YouTube shows it (e.g. `2 days ago`) |
| `likeCount` | Number of likes on the post |
| `commentCount` | Number of comments on the post |
| `pollChoices` / `pollTotalVotes` | Poll or quiz options (and `isCorrect` for quizzes) and the total vote count |
| `images` | Image URLs with width and height (image posts); adds `storedKey` and `storedUrl` when image download is on |
| `videoId` / `videoTitle` | Embedded video (or playlist) ID and title |
| `comments` | Array of comments on the post (when comment scraping is enabled) |
| `detectedLanguage` | ISO 639-3 language code of the post text (when language detection is enabled) |

See the [Output example](#output-example) below for the full record shape. Download results in JSON, CSV, Excel, or XML.

### How to scrape YouTube community posts

1. Click **Try for free** / **Start** to open the YouTube Community Posts Scraper.
2. Add one or more channels to **YouTube Channel URLs, @handles, or Channel IDs** — for example `@mkbhd` or `https://www.youtube.com/@veritasium`.
3. Set **Max Posts Per Channel** and, optionally, a **Post Types**, **Keyword**, or date filter.
4. To also collect comments, turn on **Include Post Comments** and set **Max Comments Per Post**. To save images, turn on **Download Images**. To tag languages, turn on **Detect Post Language**.
5. Keep the default **Proxy Configuration** (Apify Proxy).
6. Press **Start**. Results stream into the dataset as they are collected.
7. Open the **Storage** tab and export as JSON, CSV, Excel, or XML, or pull them from the [API](https://docs.apify.com/api/v2).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `urls` | array | **Yes** | `["@mkbhd"]` | Channel URLs, `@handles`, or `UC...` channel IDs. Up to 100. |
| `maxPostsPerChannel` | integer | No | `50` | Max community posts per channel (1–200). |
| `postTypes` | string | No | `all` | `all`, `text`, `poll`, `image`, or `video`. |
| `keyword` | string | No | — | Only include posts whose text contains this (case-insensitive). |
| `dateFrom` / `dateTo` | string | No | — | Approximate publish-date range, `YYYY-MM-DD`. |
| `includeComments` | boolean | No | `false` | Scrape comments on each post (paid add-on). |
| `maxCommentsPerPost` | integer | No | `10` | Max comments per post (0–100). |
| `downloadImages` | boolean | No | `false` | Save full-resolution images to the Key-Value Store (paid add-on). |
| `detectLanguage` | boolean | No | `false` | Add a `detectedLanguage` field (paid add-on). |
| `concurrency` | integer | No | `3` | Channels processed in parallel (1–5). |
| `proxyConfig` | object | No | Apify Proxy | Proxy settings for reaching YouTube. |

#### Input example

```json
{
    "urls": ["@mkbhd"],
    "maxPostsPerChannel": 50,
    "postTypes": "all",
    "includeComments": false,
    "maxCommentsPerPost": 10,
    "downloadImages": false,
    "detectLanguage": false,
    "concurrency": 3
}
```

### Output example

```json
{
    "status": "Success",
    "postId": "Ugkxa3BN5SFLT-KGgPZYyJlmsaR_vGGhu9ok",
    "postUrl": "https://www.youtube.com/post/Ugkxa3BN5SFLT-KGgPZYyJlmsaR_vGGhu9ok",
    "postType": "image",
    "channelName": "Marques Brownlee",
    "channelId": "UCBJycsmduvYEL83R_U4JriQ",
    "channelUrl": "https://www.youtube.com/@mkbhd",
    "text": "Introducing a new colorway and updated design: 251.1. Now in matte black.",
    "publishedTimeText": "2 years ago",
    "likeCount": 31614,
    "commentCount": 1300,
    "images": [
        { "url": "https://yt3.ggpht.com/DRQFUxLpjmjn-SYaIqWGtXLcx-pD78rqnmhk-yhQEaOSMbQO=s0", "width": 5464, "height": 5464 }
    ]
}
```

A poll post:

```json
{
    "status": "Success",
    "postId": "Ugkxj6Q6RVlWHXsdOKX0nmi0LeLGZFSzoCxk",
    "postType": "poll",
    "channelName": "Veritasium",
    "text": "What is the most used operating system in the world?",
    "publishedTimeText": "1 year ago",
    "likeCount": 5121,
    "commentCount": 1100,
    "pollChoices": [
        { "text": "Windows", "isCorrect": false },
        { "text": "MacOS", "isCorrect": false },
        { "text": "Linux", "isCorrect": true }
    ],
    "pollTotalVotes": "312K votes"
}
```

### Use cases

- 📈 **Creator and competitor monitoring** — track how often channels post, which post types get the most engagement, and how sentiment shifts in the comments.
- 🗳️ **Poll and quiz analysis** — collect every poll a channel has run, with options and total votes.
- 🖼️ **Media archiving** — download image drops and store them alongside their captions and metadata.
- 🧠 **Audience research** — pull post comments at scale for topic modelling, sentiment analysis, or feedback mining.
- 🌍 **Multi-language tracking** — tag each post's language to segment an international channel's output.
- 🤖 **AI and RAG pipelines** — feed structured community-post data to agents and LLM workflows via the Apify API or [MCP](https://docs.apify.com/platform/integrations/mcp).

### How it works

1. For each channel, the actor loads the public community posts page and reads the embedded post data.
2. It pages through YouTube's own "load more" endpoint until `maxPostsPerChannel` is reached or the channel runs out of posts.
3. Each post is normalized into a flat record; post-type filters, the keyword filter, and the approximate date range are applied as posts are read.
4. When enabled, comments are fetched per post, images are downloaded to the Key-Value Store, and the post language is detected.
5. Records stream into the dataset as they are collected, so partial results are always available.

### How much does it cost to scrape YouTube community posts?

This actor uses **pay-per-result** pricing. Only the base `post-scraped` event fires on a standard run; the other three events fire only when you turn on the matching add-on.

| Event | What it covers | Price per 1,000 (Free) | Gold |
|-------|----------------|------------------------|------|
| `post-scraped` | Each community post saved | **$2.70** | $2.00 |
| `comment-scraped` | Each comment (add-on) | **$2.00** | $1.00 |
| `image-stored` | Each image saved to storage (add-on) | **$2.00** | $1.50 |
| `language-detected` | Each post language identified (add-on) | **$0.30** | $0.20 |

Example: 500 posts with no add-ons costs about **$1.00–$1.35**. The same 500 posts with 10 comments each adds roughly **$10** for comments on the Free tier (**$5** on paid tiers).

### FAQ

**Do I need a YouTube API key or a Google account?**
No. The actor reads YouTube's public community-post data. There is nothing to authenticate and no quota.

**What channel formats are accepted?**
`@handles` (`@mkbhd`), full channel URLs (`https://www.youtube.com/@mkbhd`, `https://www.youtube.com/channel/UC...`), and bare channel IDs starting with `UC`. Up to 100 per run.

**How many posts can I get per channel?**
YouTube serves roughly 200 community posts per channel. Set `maxPostsPerChannel` up to 200.

**Why is date filtering "approximate"?**
YouTube only exposes relative timestamps like "2 days ago" or "1 year ago", so `dateFrom` / `dateTo` are matched against an estimate derived from that text.

**A channel returned a `status` message instead of posts.**
That channel has no community tab (the feature is not enabled, or the channel is too small), the handle was wrong, or YouTube temporarily blocked the request. Other channels in the same run are unaffected.

**Are poll vote percentages included?**
YouTube only shows per-option percentages to signed-in voters. The actor returns each option's label, `isCorrect` for quizzes, and the total vote count (`pollTotalVotes`).

**How does billing work for the add-ons?**
You are charged only when an enrichment succeeds — per comment scraped, per image actually stored, and per post whose language is detected (not when detection fails).

**Can I schedule recurring runs?**
Yes. Use Apify [Schedules](https://docs.apify.com/platform/schedules) to run the scraper daily or weekly and send results to [integrations](https://apify.com/integrations) like Google Sheets, Make, Zapier, or a webhook.

**How do I call it from code?**

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/youtube-community-posts-scraper").call(run_input={
    "urls": ["@mkbhd", "@veritasium"],
    "maxPostsPerChannel": 50,
    "postTypes": "all",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("postType"), item.get("likeCount"), item.get("text", "")[:80])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/youtube-community-posts-scraper').call({
    urls: ['@mkbhd', '@veritasium'],
    maxPostsPerChannel: 50,
    postTypes: 'all',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Something looks wrong or missing.**
Open an issue on the **Issues** tab with the input you used. Feedback is welcome and helps keep the YouTube Community Posts Scraper reliable.

### Is it legal to scrape YouTube community posts?

Web scraping of publicly available data is legal in most jurisdictions, including the US and EU, when you do not collect private personal data or bypass authentication. This actor only reads public YouTube posts and public comments — no login. You are responsible for how you use the collected data, including compliance with YouTube's Terms of Service, applicable laws (GDPR, CCPA), and copyright. See Apify's [guide to the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for background.

### Related Apify actors

- [YouTube Search Scraper](https://apify.com/parsebird/youtube-search-scraper) — videos, channels, and playlists from YouTube search
- [YouTube Channel Search Scraper](https://apify.com/parsebird/youtube-channel-search-scraper) — find and profile YouTube channels
- [YouTube Live Chat Scraper](https://apify.com/parsebird/youtube-live-chat-scraper) — live and replay chat messages from streams
- [YouTube Thumbnail Downloader](https://apify.com/parsebird/youtube-thumbnail-downloader) — full-resolution thumbnails for any video

Browse the full [ParseBird actor collection](https://apify.com/parsebird) for more social and video scrapers.

# Actor input Schema

## `urls` (type: `array`):

YouTube channel URLs, @handles, or channel IDs. Accepts formats like @mkbhd, https://www.youtube.com/@mkbhd, https://www.youtube.com/channel/UCBcRF18a7Qf58cCRy5xuWwQ, or bare channel IDs starting with UC. Up to 100 channels per run.

## `maxPostsPerChannel` (type: `integer`):

Maximum number of community posts to scrape per channel. YouTube typically serves up to 200 posts per channel.

## `postTypes` (type: `string`):

Filter by post type. 'All' includes every post type.

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

Only include posts containing this text. Leave empty to include all posts. Case-insensitive.

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

Only include posts published after this date (approximate). YouTube shows relative timestamps like '2 days ago', so filtering is approximate. Format: YYYY-MM-DD.

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

Only include posts published before this date (approximate). Format: YYYY-MM-DD.

## `includeComments` (type: `boolean`):

Scrape comments on each community post. Comments are embedded in each post's output row. This is a paid add-on ($0.001 per comment) and increases run time.

## `maxCommentsPerPost` (type: `integer`):

Maximum number of comments to scrape per community post. Only used when 'Include Post Comments' is enabled.

## `downloadImages` (type: `boolean`):

Download full-resolution images from image posts to the Apify Key-Value Store. Adds download URLs to the output. You are only charged per image successfully stored ($0.002 per image).

## `detectLanguage` (type: `boolean`):

Detect the language of each post's text. Adds a 'detectedLanguage' field to the output. You are only charged when a language is successfully detected, not when detection fails ($0.0005 per detection).

## `concurrency` (type: `integer`):

Number of channels to process in parallel. Higher values are faster but use more memory.

## `proxyConfig` (type: `object`):

Select proxies for accessing YouTube. Apify Proxy is recommended.

## Actor input object example

```json
{
  "urls": [
    "@mkbhd"
  ],
  "maxPostsPerChannel": 50,
  "postTypes": "all",
  "includeComments": false,
  "maxCommentsPerPost": 10,
  "downloadImages": false,
  "detectLanguage": false,
  "concurrency": 3,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "urls": [
        "@mkbhd"
    ],
    "maxPostsPerChannel": 50,
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/youtube-community-posts-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 = {
    "urls": ["@mkbhd"],
    "maxPostsPerChannel": 50,
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/youtube-community-posts-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 '{
  "urls": [
    "@mkbhd"
  ],
  "maxPostsPerChannel": 50,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call parsebird/youtube-community-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/youtube-community-posts-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/4TVt4haNoqkAP3heg/builds/NffnpfO9xFKpB4Tm1/openapi.json
