# Skool Scraper - Community Stats & Public Posts (No Login) (`rjmacarthy/skool-scraper`) Actor

Scrape public Skool communities without login or cookies: members, online count, posts total, price, categories, levels, owner, links, events, plus public feed posts with likes, comments, category and author. Sort, category filter, only-new-posts monitoring.

- **URL**: https://apify.com/rjmacarthy/skool-scraper.md
- **Developed by:** [rj](https://apify.com/rjmacarthy) (community)
- **Categories:** Social media
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 post scrapeds

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

## Skool Scraper - Community Stats & Public Posts (No Login)

Scrape any **public Skool community** the way a logged-out visitor sees it: community stats (members, online now, total posts, price, privacy, categories, levels, owner, sidebar links, upcoming events) and the **public feed posts** (title, full text, category, likes, comments, pinned flag, video links, author display name). **No login, no session cookie, no browser.** Most Skool scrapers ask you to paste your own session cookie, which puts your account at risk. This one doesn't. You get community stats and posts in one run, sorting and category filters like the feed menu, and an **only-new-posts** mode for watching competitor communities. There is **no start fee**: you pay per community record and per post.

### What data can you get?

| Community record (`type: "community"`) | Post (`type: "post"`) |
|---|---|
| Name, slug, URL, description, about text | Title, URL, post ID |
| Members, online now, total posts, admins, courses | Full text (lists as `- `, mentions as `@Name`) |
| Public / private, free / paid, price, currency, interval | Category name and ID |
| Review rating and count (paid communities) | Created, updated, last-comment time |
| Feed categories with post counts | Likes (upvotes), comments count |
| Owner display name | Pinned flag |
| Sidebar links (website, YouTube, offers) | Video URLs (YouTube, Loom...), attachments count, preview image |
| Level names with % of members per level | Author display name |
| Upcoming events: title, start, end, timezone | Community slug |
| Created date, cover and logo images | `contentTruncated` flag |

**Private communities** give the community record only (members, price, privacy, rating...). Their posts need a membership, and this Actor never logs in.

### Use cases

- **Competitor research for creators.** Track members, online count, pricing and post activity of the communities in your niche.
- **Market sizing.** Compare dozens of Skool communities by members, price and activity in one table.
- **Content research.** Pull the top posts of the month from big communities to find topics that get likes and comments.
- **Community monitoring.** Schedule the Actor with "Only new posts" to get every new post from a list of communities in Slack, Sheets or your CRM.
- **Lead and partner discovery.** Find active public communities, their owners and published links.

### How to use

1. Add one or more **Skool communities**: full URLs (`https://www.skool.com/ai-automation-society`) or slugs (`ai-automation-society`). Post and about URLs work too.
2. Choose **Community + posts** or **Community stats only**.
3. Optionally set **Sort** (Default, Newest, Top day/week/month/year/all time), a **Category** and **Max posts per community**.
4. Run, then download JSON, CSV or Excel, or use the API.

#### Input examples

Top posts of the month from one community:

```json
{
  "communityUrls": ["https://www.skool.com/ai-automation-society"],
  "sort": "top-month",
  "maxPostsPerCommunity": 20
}
```

Compare communities (stats only, one request each):

```json
{
  "communityUrls": ["ai-automation-society", "ai-automation-society-plus", "brendan", "maker-zero"],
  "mode": "community"
}
```

Daily monitor of new posts in one category:

```json
{
  "communityUrls": ["https://www.skool.com/ai-automation-society"],
  "category": "Wins",
  "onlyNew": true,
  "stateKey": "ais-wins",
  "maxPostsPerCommunity": 50
}
```

### Output example

Real output (trimmed):

```json
[
  {
    "type": "community",
    "id": "b51c57150c70495899bf4bc8aaee8166",
    "slug": "ai-automation-society",
    "url": "https://www.skool.com/ai-automation-society",
    "aboutUrl": "https://www.skool.com/ai-automation-society/about",
    "displayName": "AI Automation Society",
    "description": "Learn to get paid for AI solutions, regardless of your background.",
    "aboutDescription": "Join the LARGEST Global AI Automation Community in the World.\n\nGo from watching AI videos to building your own AI Operat...",
    "coverUrl": "https://assets.skool.com/f/b51c57150c70495899bf4bc8aaee8166/0e92d116d6df45d1ba056db9bf817beb02fd4474087249bdaff2bbdcea15c5bd-md.jpg",
    "logoUrl": "https://assets.skool.com/f/b51c57150c70495899bf4bc8aaee8166/ae8b1910caae49cc9c36e5356ec35c828192ceef52964628963382b78d89b4e8.jpg",
    "color": "#0693E3",
    "membersCount": 480082,
    "onlineCount": 1200,
    "postsCount": 26866,
    "adminsCount": 16,
    "coursesCount": 17,
    "privacy": "public",
    "isPaid": false,
    "priceAmount": null,
    "priceCurrency": null,
    "priceInterval": null,
    "reviewRating": null,
    "reviewsCount": null,
    "categories": [
      {
        "id": "0464a29d2fe74f38ab0aeca1d04a1e86",
        "name": "General Discussion 💬",
        "description": "Discuss anything here! Let’s get to know each other.",
        "postsCount": 16234
      },
      {
        "id": "e2d58b6295b940cebad1e96bb936efb1",
        "name": "YouTube Resources 📚",
        "description": "This is where you can find resources I reference in my videos. n8n workflows, code snippets, etc.",
        "postsCount": 359
      }
    ],
    "ownerName": "Nate Herk",
    "links": [
      {
        "label": "YOUTUBE RESOURCES 📚",
        "url": "https://www.skool.com/ai-automation-society/looking-for-a-youtube-video-resource?p=69461272"
      }
    ],
    "levels": [
      {
        "level": 1,
        "name": "AI Explorer 🛠️",
        "percentOfMembers": 89
      },
      {
        "level": 2,
        "name": "Automation Novice 🛠️",
        "percentOfMembers": 4
      }
    ],
    "upcomingEvents": [
      {
        "title": "🔒 Q&A w/ Nate",
        "startTime": "2026-11-09T09:00:00-06:00",
        "endTime": "2026-11-09T09:30:00-06:00",
        "timezone": "America/Chicago"
      }
    ],
    "createdAt": "2024-10-15T02:49:53.919Z",
    "postsStatus": "ok",
    "source": "input",
    "suggestedFrom": null,
    "scrapedAt": "2026-11-07T12:26:04.344Z"
  },
  {
    "type": "post",
    "id": "61e0e458a6b2440d831f4bdc146d8eae",
    "url": "https://www.skool.com/ai-automation-society/new-video-every-ai-business-ranked-from-worst-to-best",
    "title": "🚀New Video: Every AI Business Ranked from Worst to Best",
    "contentText": "Which AI business should you actually start? There are more of them every day, so I ranked every AI business from worst to best, 13 in total, scoring each one on how technical you need to be, the mark...",
    "contentTruncated": false,
    "category": "YouTube Resources 📚",
    "categoryId": "e2d58b6295b940cebad1e96bb936efb1",
    "createdAt": "2026-11-05T10:16:51.065Z",
    "updatedAt": "2026-11-07T12:17:05.818Z",
    "lastCommentAt": "2026-11-07T11:59:03.745Z",
    "upvotes": 233,
    "commentsCount": 121,
    "isPinned": true,
    "hasVideo": true,
    "videoUrls": [
      "https://youtu.be/O3g_m2i2IGU?views="
    ],
    "attachmentsCount": 0,
    "imagePreviewUrl": "https://i.ytimg.com/vi/O3g_m2i2IGU/hqdefault.jpg",
    "authorName": "Nate Herk",
    "communitySlug": "ai-automation-society",
    "scrapedAt": "2026-11-07T12:26:04.344Z"
  }
]
```

The dataset has two views: **Posts** and **Communities**. A run summary with per-community status, request counts and errors is saved as `RUN_SUMMARY` in the key-value store.

### Pricing

Pay per event, no start fee:

| Event | Price | When |
|---|---|---|
| `post` | $0.003 | each post in the dataset |
| `community` | $0.003 | each community record in the dataset |

Examples: **1,000 posts from 10 communities ≈ $3.03** (1,000 × $0.003 + 10 × $0.003). Stats for **100 communities ≈ $0.30**. Set "Maximum cost per run" and the Actor stops cleanly when it is reached.

### Tips and limits

- Skool's feed shows about **30 posts per page** plus pinned posts on page 1. The scraper pages through with a polite 1 request per second.
- The feed cuts long posts at **2,000 characters** (`contentTruncated: true`). Turn on **Fetch full text of long posts** to open those posts and get the full text: one extra request per long post.
- **Comments and commenters are not scraped.** You get the comment count only. We don't output member lists, member profiles, leaderboards or contributor lists.
- **Suggested communities.** With "Include suggested communities" on, the Actor outputs the communities Skool suggests on the page. Skool shows them only for some communities, and in our tests most pages had none. Skool's `/discovery` page is behind a bot challenge, so this Actor doesn't use it.
- "Default" sort is Skool's latest-activity order: a new comment bumps an old post up. Use **Newest** for creation order. "Only new posts" always uses Newest.
- Language isn't published by Skool, so there is no language field.

### FAQ

**Do I need a Skool account, cookies or a proxy?**
No. The Actor reads the same pages a logged-out visitor sees. A proxy option exists in case Skool rate-limits or blocks a run (use Apify Proxy, datacenter).

**Can it scrape private or paid communities' posts?**
No. For private communities you get the public community record (members, price, privacy, rating, owner), and `postsStatus` says `private`.

**Why are residential proxies not supported?**
Under pay-per-event pricing the developer pays for proxy traffic. Skool pages are large (about 750 KB), so residential traffic (about $8/GB) would cost more than the posts earn. If you choose the RESIDENTIAL group, the Actor logs a warning and uses Apify datacenter proxy instead.

**How does "Only new posts" work?**
The first run outputs the current posts and saves their IDs in a named key-value store (`skool-scraper-state`, key = your state key). Later runs output only posts created since then. Use a different state key for each scheduled task.

**Is it legal to scrape Skool?**
This Actor only collects data that Skool shows publicly to logged-out visitors, and it respects robots.txt. It doesn't collect emails, phone numbers, member lists, member profiles or commenters. The only names it outputs are a post author's public display name and the community owner's display name. You are responsible for using the data in line with Skool's terms and data-protection law (e.g. GDPR) in your jurisdiction.

**A community fails with "not found".**
The slug has changed or the community was deleted. Open the URL in a browser and copy the current one.

### Integrations

- **API.** Run it and get results in one call:

  ```bash
  curl -X POST "https://api.apify.com/v2/acts/rjmacarthy~skool-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"communityUrls":["ai-automation-society"],"maxPostsPerCommunity":10}'
  ```

- **Make, Zapier, n8n.** Send new posts to Google Sheets, Airtable, Slack or email with no code.

- **Webhooks and schedules.** Run daily with "Only new posts" and get notified when a run finishes.

- **AI agents (MCP).** Use the Actor as a tool through the Apify MCP server, e.g. "summarise this week's top posts in these 5 communities".

- Also from us: **Substack Scraper**, for newsletters, the other half of the creator economy.

### Changelog

- **0.1** (2026-11): first release. Community stats, public feed posts, sort, category filter, full-text fetch, suggested communities, only-new-posts mode.

### More scrapers by the same developer

- [Snapchat Scraper - Public Profiles, Spotlight & Story Stats](https://apify.com/rjmacarthy/snapchat-scraper)
- [Bilibili Scraper - Videos, Search, Popular & Uploader Stats](https://apify.com/rjmacarthy/bilibili-scraper)
- [Bluesky Scraper - Posts, Profiles, Threads & Feeds (No Login)](https://apify.com/rjmacarthy/bluesky-scraper)
- [Domain WHOIS Lookup - Bulk RDAP, Expiry, DNS & Availability](https://apify.com/rjmacarthy/domain-whois-lookup)
- [Keyword Suggestions Scraper - Google, YouTube & Bing](https://apify.com/rjmacarthy/keyword-suggestions-scraper)
- [Substack Scraper](https://apify.com/rjmacarthy/substack-scraper)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

### Support

Found a community that doesn't work, or need another field? Open an issue on the **Issues** tab with the URL. Fixes are usually quick.

# Actor input Schema

## `communityUrls` (type: `array`):

Community URLs or slugs, one per line, e.g. "https://www.skool.com/ai-automation-society" or just "ai-automation-society". Post, about and classroom URLs resolve to their community.

## `mode` (type: `string`):

"Community + posts" outputs one community record plus feed posts per community. "Community stats only" outputs just the community record (one request per community). Private communities always give the community record only.

## `maxPostsPerCommunity` (type: `integer`):

Stop after this many posts per community (0 = no limit). Skool shows about 30 posts per page, plus pinned posts on page 1.

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

Same as the feed's sort menu. "Default" is Skool's latest-activity order (new comments bump posts up). "Only new posts" always uses "Newest".

## `category` (type: `string`):

Only posts from this feed category, by name (e.g. "General Discussion", emojis optional, prefix is enough) or category ID. Unknown names are logged and the whole feed is scraped. Leave empty for all categories.

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

Stop the run after this many dataset items (communities + posts) in total (0 = no limit).

## `fetchFullContent` (type: `boolean`):

The feed cuts posts at 2,000 characters (flagged by contentTruncated). Turn this on to open those posts and get the full text: one extra request per long post (usually 1-3 per page).

## `includeSuggested` (type: `boolean`):

Also output the communities Skool suggests on the scraped pages, as extra community records (source = "suggested"). Skool shows suggestions only for some communities; most pages have none.

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

Monitor mode: output only posts not output by an earlier run with the same state key. The first run outputs the current posts and saves them; later runs output only posts created since. Community records are still output every run.

## `stateKey` (type: `string`):

Name of this monitor, so different scheduled tasks keep separate "seen posts" lists.

## `stateStoreName` (type: `string`):

Named key-value store that keeps the "seen posts" lists between runs.

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

Not needed normally: Skool's community pages answer Apify's servers directly. Enable Apify Proxy (datacenter) only if you see HTTP 403/429 or challenge errors. Residential proxies are not supported and fall back to datacenter proxy.

## Actor input object example

```json
{
  "communityUrls": [
    "https://www.skool.com/ai-automation-society"
  ],
  "mode": "posts",
  "maxPostsPerCommunity": 10,
  "sort": "default",
  "maxItems": 1000,
  "fetchFullContent": false,
  "includeSuggested": false,
  "onlyNew": false,
  "stateKey": "default",
  "stateStoreName": "skool-scraper-state",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `posts` (type: `string`):

Feed posts: title, category, author, date, likes, comments and URL.

## `communities` (type: `string`):

Community stats: members, online, posts, price, privacy, owner.

## `all` (type: `string`):

Every field of every item, incl. post text, categories, levels, links and events.

## `summary` (type: `string`):

Per-community status, counts and errors.

# 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 = {
    "communityUrls": [
        "https://www.skool.com/ai-automation-society"
    ],
    "mode": "posts",
    "maxPostsPerCommunity": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/skool-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 = {
    "communityUrls": ["https://www.skool.com/ai-automation-society"],
    "mode": "posts",
    "maxPostsPerCommunity": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("rjmacarthy/skool-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 '{
  "communityUrls": [
    "https://www.skool.com/ai-automation-society"
  ],
  "mode": "posts",
  "maxPostsPerCommunity": 10
}' |
apify call rjmacarthy/skool-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rjmacarthy/skool-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/9IJB7WFR06PGuykEY/builds/ruADnODCuz05ztIQQ/openapi.json
