# Skool Member Count & Price Monitor - Skool Scraper (`neverempty/skool-member-count-price-monitor`) Actor

Track Skool communities: member count, price (free or monthly, yearly, one-time), online count, posts, courses, rating, creator and description, one row per community. Monitoring mode returns only communities whose members, price or description changed, with the difference.

- **URL**: https://apify.com/neverempty/skool-member-count-price-monitor.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.60 / 1,000 community returneds

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

## Skool Member Count & Price Monitor - Skool Scraper

**Track any Skool community's member count, price and description, and get told when they change.** Give the Skool communities you want to follow (your competitors, your niche, your own) and get one row per community: members, online now, admins, posts, courses, free or paid with the exact price (monthly, yearly or one-time), rating, creator and the full about text.

- **Monitoring mode returns only what changed.** Schedule the same list daily or hourly. Each later run returns only the communities whose member count, price, description or name changed, with the previous value, the member difference and the percentage. Nothing changed means no rows to sift through.
- **The price exactly as the community page shows it.** `$184/month`, `$6,000/year`, `$37` one-time or `Free`, plus the yearly plan price when the community offers one. Skool's own "membership" flag is not used as the paid flag, because free communities can carry it.
- **Asked for X, got X.** A community name Skool does not have comes back as a free `not-found` row, never as some other community. Every row carries the community's own Skool id and address.
- **Paste what you have.** A community address (`https://www.skool.com/your-community`), its `/about` page, any page inside it, or just the name.
- No login, no cookies, no proxy needed. Only the public about page of each community is read, one request at a time.

### Who uses it

- **Community owners and course creators**: follow the communities in your niche and see who is growing, who raised the price, and who rewrote their offer.
- **Agencies, investors and analysts**: build a weekly table of member counts and prices for a list of Skool communities and watch growth over time.
- **Marketers and affiliates**: spot fast-growing communities and price changes the day they happen.

### Input

```json
{
    "communities": [
        "https://www.skool.com/ai-automation-society",
        "https://www.skool.com/makerschool"
    ],
    "monitoringMode": false
}
```

- **`communities`** - community addresses or names, one per line, up to 500 per run. No default: a run reads only what you give.
- **`monitoringMode`** - return only communities that changed since the last run.
- **`minMemberChange`** - monitoring only: report a member change only when it is at least this many members (default 1). Price and description changes are always reported.
- **`resetMonitoringState`** - forget what monitoring remembers and start again.

### What you get

| Column | Meaning |
|---|---|
| `name`, `communitySlug`, `communityUrl`, `communityId` | The community as Skool names it, its address and Skool's id |
| `memberCount` | Members, as an exact number (the page shows it rounded, for example 2.5k for 2,566) |
| `onlineCount`, `adminCount`, `postCount`, `courseCount` | Members online at the moment of reading, admins, posts and courses |
| `accessType` | `public` or `private`, as shown on the page |
| `isPaid`, `priceText`, `priceAmount`, `priceCurrency`, `priceInterval` | Free or paid, and the price shown on the page: `priceText` such as `$184/month`, the amount, the currency and `month`, `year` or `one_time` |
| `annualPriceAmount` | The yearly plan price when the community offers one |
| `reviewRating`, `reviewCount` | The community's rating and number of reviews; `null` when the page shows none |
| `creatorName` | The creator shown on the page ("By ...") |
| `shortDescription`, `aboutDescription` | The one-line description and the full about text |
| `communityCreatedAt` | When the community was created on Skool |
| `status`, `scrapedAt` | `ok` for a community row; when the run delivered it |

**Monitoring rows also have:** `change` (`changed`), `changeTypes` (any of `members`, `price`, `description`, `name`), `previousMemberCount`, `memberCountChange`, `memberCountChangePercent`, `previousPriceText`, `previousPriceAmount`, `previousPriceInterval`, `previousName`, `previousShortDescription`, `aboutDescriptionChanged` and `previousSnapshotAt` (when the value compared against was recorded).

A value Skool does not give is `null`, never an empty string or a made-up 0.

### Monitoring mode

Turn on `monitoringMode` and schedule the same input.

1. **First run of a community**: its member count, price and description are remembered. No row, nothing charged, one free `baseline-saved` row per community.
2. **Later runs**: a community is returned only when something changed (`change: "changed"`), with the previous values and the difference.
3. **Nothing changed**: one free `no-change` row lists each community with its current and remembered member count, and one small monitoring check is charged for each community that was read and had no change.

Details that matter:

- What is remembered is kept per community (by Skool's community id), so adding a community to a scheduled input does not reset the others.
- The comparison is always against the value at the last returned change (or the first run). With `minMemberChange: 50`, ten runs of +10 members each are returned once the total reaches 50, not lost.
- If the maximum total charge of a run is too small for every changed community, the ones that did not fit are not remembered and are returned at the next run.
- If a community could not be read, nothing about it is charged or changed.

### What is charged

- **Community returned**: one per community row.
- **Community checked**: monitoring mode only, one per community that was read and had no change.
- Not charged: the first monitoring read of a community, rows that say a community was not found or could not be read, `no-change`, limit and budget rows. There is no start fee.

### Rows that are not communities

Every run says what happened. These rows have a `status` other than `ok`, a `note` in plain English, and are free:

`not-found` (Skool has no community at that address) · `invalid-input` (the line is not a community address, for example a member profile or the discovery page) · `community-unreadable` / `community-blocked` (the page could not be read; the HTTP status is in `httpStatus`) · `baseline-saved` · `no-change` · `limit-reached` · `budget-reached` · `not-read` · `disallowed-by-robots` / `robots-unreadable`.

### Good to know

- This is an unofficial tool, not affiliated with Skool. It reads only the public about page of each community, the same page any visitor sees without logging in, and only pages Skool's robots.txt allows.
- Individual members are not collected: no member names, profiles, online-member lists, leaderboards or review texts. The creator's name is the one the page shows as the community's creator.
- Give the communities you want to follow; searching Skool's discovery list is not offered.
- Requests are sent one at a time with more than a second between them: 40 communities took about 63 seconds on 2026-10-12.
- Skool shows member counts as they are at the moment of reading; `onlineCount` changes minute by minute and is not used to decide whether a community changed.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

## `communities` (type: `array`):

Skool communities to read, one per line: the community address (https://www.skool.com/your-community-name; its /about page or any page inside the community also works) or just the community name from that address. Each community returns one row. A name Skool does not have comes back as a free "not-found" row; no other community is used in its place. Up to 500 per run.

## `monitoringMode` (type: `boolean`):

Run the same input on a schedule. The first run of a community only remembers its member count, price and description (no row, no charge). Every later run returns only communities whose member count, price, description or name changed, with the previous values and the difference. A community with no change is charged one small monitoring check and the run returns a free "no-change" row.

## `minMemberChange` (type: `integer`):

Monitoring mode only: report a member count change only when the count went up or down by at least this many members since the remembered value. Price and description changes are always reported. Leave it at 1 to report every change.

## `resetMonitoringState` (type: `boolean`):

Clears everything monitoring mode remembers for every community before this run, so each community starts again with a first read. Leave it off for normal scheduled runs.

## Actor input object example

```json
{
  "communities": [
    "https://www.skool.com/ai-automation-society",
    "https://www.skool.com/makerschool"
  ],
  "monitoringMode": false,
  "minMemberChange": 1,
  "resetMonitoringState": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per Skool community: name, address, member count, online count, admins, posts, courses, public or private, free or paid with the price, rating, creator and description. In monitoring mode, only changed communities with the previous values and the difference. Communities that could not be read or were not found, runs with no change, and runs that hit a limit come back as their own rows and are not charged.

# 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 = {
    "communities": [
        "https://www.skool.com/ai-automation-society",
        "https://www.skool.com/makerschool"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/skool-member-count-price-monitor").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 = { "communities": [
        "https://www.skool.com/ai-automation-society",
        "https://www.skool.com/makerschool",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/skool-member-count-price-monitor").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 '{
  "communities": [
    "https://www.skool.com/ai-automation-society",
    "https://www.skool.com/makerschool"
  ]
}' |
apify call neverempty/skool-member-count-price-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/skool-member-count-price-monitor"
        }
    }
}
```

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/2G0HIkkFPdjDnctVL/builds/dZBPjR1tdxBoOub46/openapi.json
