# Skool Communities Scraper - Discovery, Members, Pricing (`scrapewise/skool-communities`) Actor

Scrape Skool communities from the public discovery directory and about pages: name, URL, description, category, members, price, courses, rating and owner display name. No login, no emails. US$ 3 per 1,000 communities.

- **URL**: https://apify.com/scrapewise/skool-communities.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 skool community delivereds

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 Communities Scraper: Discovery Directory, Members, Pricing and Courses

**Skool Communities Scraper** turns the public Skool discovery directory into a clean spreadsheet of communities: name, URL, description, member count, monthly price, courses, rating, review count and the owner's public display name. It is built for market research on Skool, for creators checking a niche before they launch, and for agencies that track paid communities. No login, no cookies, no emails, no member lists.

### What you can do with it

- **Market research on Skool communities:** list the top 1,000 communities for "fitness", "real estate" or "ai automation" with member counts and prices, then sort by size or price in a spreadsheet.
- **Creators validating a niche and a price point:** see how many paid communities exist in your topic, what they charge per month, how many courses they ship and how members rate them, before you set your own price.
- **Agencies and consultants:** build a watch list of paid Skool communities in a vertical (sales, e-commerce, coaching), schedule a weekly run and compare member growth and price changes over time.

### What makes it different

Some Skool scrapers sell the community owner's email address, full contact details or the member list. This Actor does not, by design:

- **Only public community data.** Everything comes from the public discovery directory and the public about page that Skool shows to any visitor who is not logged in.
- **Owner: display name and public profile link only.** No email, no phone, no location, no time zone, no personal bio and no personal social links.
- **No members, posts, comments, lessons or classroom content.** That content sits behind a Skool login and stays there.
- **Free text is cleaned.** If a community description contains an email address or a phone number, it is replaced with `[email removed]` or `[phone removed]` before it is saved.
- **Contact options from other Skool scrapers are ignored.** Inputs like `includeOwnerDetails`, `enrichOwners` or `email` do not unlock anything; the run log says they were ignored.

If you need personal contact data for cold outreach, this is not the right tool. If you need a reliable, compliant picture of the Skool market, it is.

### Input example

Search the directory for one or more keywords with filters:

```json
{
  "mode": "search",
  "searchQueries": ["marketing"],
  "price": "paid",
  "language": "english",
  "minMembers": 200,
  "includeDetails": true,
  "maxItems": 30
}
```

Read the about page of specific communities (URLs or slugs):

```json
{
  "mode": "communities",
  "startUrls": [
    "https://www.skool.com/makerschool/about",
    "aivideobootcamp"
  ]
}
```

Browse a whole category, most popular first, free communities only:

```json
{
  "category": "tech",
  "price": "free",
  "sortBy": "top",
  "maxItems": 100
}
```

#### Input fields

| Field | What it does |
|---|---|
| `mode` | `search` (discovery directory) or `communities` (about pages). Sending only URLs switches to `communities` automatically. |
| `searchQueries` | Keywords searched on skool.com/discovery. Empty lists the whole directory with your filters. |
| `startUrls` | Community URLs, about URLs or slugs. A `skool.com/discovery?...` URL runs as a search with its filters. |
| `category` | hobbies, music, money, spirituality, tech, health, sports, self\_improvement, relationships. `categories` (list) also works by API. |
| `language` | Skool language name (english, spanish, portuguese, german, french...) or a two-letter code (EN, ES, PT). |
| `price` | `all`, `free`, `paid` or `free-trial`, the same filter Skool shows. |
| `communityType` | `all`, `public` or `private`. |
| `sortBy` | `trending` or `top`. Skool uses relevance when a keyword is searched. |
| `minMembers` | Skip communities below this member count. |
| `minPriceUsd` / `maxPriceUsd` | Monthly price range in USD (annual prices divided by 12; free counts as 0). |
| `includeDetails` | Adds courses, modules, rating, reviews, online members, posts, about text and owner display name. On by default, same price. |
| `maxItems` | Communities per keyword or category slice, up to 1,000 (Skool's own limit per search). Default 30. |
| `proxyConfiguration` | Apify datacenter proxy by default. |

**Field names from other Skool scrapers also work by API:** `searchTerms`, `queries`, `query`, `searchQuery`, `keywords`, `communityUrls`, `communityUrl`, `urls`, `communities`, `maxCommunities`, `maxResults`, `maxPages`, `membership`, `paidOnly`, `enrichDetails`, `categories`, and the modes `discover`, `discovery`, `community` and `scrape`. You can switch from another Actor without rewriting your integration.

**Empty input** runs an example search for "marketing" with 30 communities, so a quick test always returns data.

### Output example

Real rows from a run on 15/09/2026 with `{"searchQueries": ["marketing"]}` (selected fields):

```json
{"rank": 1, "name": "⭕️ Círculo de Crecimiento", "slug": "circulodecrecimiento", "url": "https://www.skool.com/circulodecrecimiento", "members": 3121, "priceType": "paid", "price": 40, "priceInterval": "month", "courses": 49, "modules": 855, "rating": 5, "reviewCount": 193, "ownerName": "Adri Kastel", "createdAt": "2025-10-06T13:01:01.421141Z"}
{"rank": 2, "name": "AION Growth Lab", "slug": "aiongrowthlab", "url": "https://www.skool.com/aiongrowthlab", "members": 576, "priceType": "paid", "price": 27, "priceInterval": "month", "courses": 22, "modules": 222, "rating": 5, "reviewCount": 36, "ownerName": "Ricardo La Rocca", "createdAt": "2026-02-18T22:37:22.557409Z"}
{"rank": 3, "name": "School of Content Marketing", "slug": "school-of-content-marketing-5537", "url": "https://www.skool.com/school-of-content-marketing-5537", "members": 261, "priceType": "freemium", "price": 148, "priceInterval": "month", "courses": 21, "modules": 368, "rating": 5, "reviewCount": 2, "ownerName": "Master Coach Aprille", "createdAt": "2025-06-10T20:41:42.708389Z"}
{"rank": 4, "name": "MM Elite", "slug": "merchant-mastery-elite", "url": "https://www.skool.com/merchant-mastery-elite", "members": 320, "priceType": "paid", "price": 1450, "priceInterval": "month", "courses": 20, "modules": 381, "rating": null, "reviewCount": null, "ownerName": "Kurian Tharakan", "createdAt": "2023-03-26T21:36:13.085765Z"}
{"rank": 5, "name": "Novel Gains", "slug": "novel-gains-1247", "url": "https://www.skool.com/novel-gains-1247", "members": 138, "priceType": "paid", "price": 35, "priceInterval": "month", "courses": 9, "modules": 36, "rating": 5, "reviewCount": 4, "ownerName": "Adam Beswick", "createdAt": "2026-06-27T09:21:22.986171Z"}
```

One full row, as it lands in the dataset:

```json
{
  "type": "community",
  "rank": 1,
  "name": "⭕️ Círculo de Crecimiento",
  "slug": "circulodecrecimiento",
  "url": "https://www.skool.com/circulodecrecimiento",
  "aboutUrl": "https://www.skool.com/circulodecrecimiento/about",
  "communityId": "ded63668f96941fe85d336bcc2419dec",
  "description": "Mi sistema para generar 3K con Marketing Digital + Inteligencia Artificial...",
  "members": 3121,
  "onlineMembers": 39,
  "admins": 9,
  "posts": 81401,
  "priceType": "paid",
  "isPaid": true,
  "price": 40,
  "priceCurrency": "USD",
  "priceInterval": "month",
  "priceText": "40 USD/month",
  "monthlyPrice": 40,
  "monthlyPriceEquivalent": 40,
  "courses": 49,
  "modules": 855,
  "rating": 5,
  "reviewCount": 193,
  "affiliateCommissionPercent": 40,
  "isPrivate": true,
  "hasClassroom": true,
  "hasCalendar": true,
  "ownerName": "Adri Kastel",
  "ownerProfileUrl": "https://www.skool.com/@adrikastel",
  "createdAt": "2025-10-06T13:01:01.421141Z",
  "searchQuery": "marketing",
  "detailsIncluded": true,
  "sourceUrl": "https://www.skool.com/discovery?q=marketing&lang=all",
  "scrapedAt": "2026-09-15T20:28:58.841166+00:00"
}
```

#### Output fields

| Field | Description |
|---|---|
| `rank` | Position in the Skool discovery results for that search (1 is first). |
| `name`, `slug`, `url`, `aboutUrl` | Community display name, Skool slug and links. |
| `communityId` | Skool's internal community id. |
| `description` | Short public description. `aboutDescription` has the full about page text. |
| `category`, `language` | The category and language filter used for the search (Skool does not publish them per community). |
| `members`, `onlineMembers`, `admins`, `posts` | Public counters from the about page. |
| `priceType` | `free`, `paid` or `freemium` (free entry with paid tiers above). |
| `price`, `priceCurrency`, `priceInterval`, `priceText` | Main price as Skool shows it. |
| `monthlyPrice`, `annualPrice`, `oneTimePrice`, `monthlyPriceEquivalent` | All price options, and a monthly figure for easy sorting. |
| `freeTierBenefits` | What the free tier includes, when the owner lists it. |
| `courses`, `modules` | Number of classroom courses and modules (counts only, never content). |
| `rating`, `reviewCount` | Average star rating and number of reviews (no individual reviews or reviewer names). |
| `affiliateCommissionPercent` | Affiliate commission the community advertises. |
| `isPrivate`, `hasClassroom`, `hasCalendar`, `hasMap` | Community settings visible on the about page. |
| `ownerName`, `ownerProfileUrl` | Owner's public display name and Skool profile link. Nothing else about the owner. |
| `logoUrl`, `coverUrl` | Community images. |
| `createdAt`, `updatedAt` | Community creation and last update dates. |
| `searchQuery`, `input`, `sourceUrl`, `scrapedAt` | Where the row came from and when. |
| `error`, `errorCode` | Present only on rows that were not charged (see below). |

The dataset has four views in the Console: **Communities**, **Pricing and size**, **About and content** and **Errors (not charged)**. Export as JSON, CSV, Excel or HTML.

### Pricing

**US$ 3 per 1,000 communities, no monthly fee.** You pay US$ 0.003 for each community delivered. The about page details are included at the same price.

Not charged: communities that do not exist, invalid URLs, invalid categories or languages, searches with no results and blocked requests. Those come back as rows with an `errorCode` (`COMMUNITY_NOT_FOUND`, `INVALID_COMMUNITY`, `INVALID_CATEGORY`, `INVALID_LANGUAGE`, `NO_RESULTS`, `BLOCKED`) so your pipeline knows what happened, and they cost nothing.

How it compares with the Skool community scrapers on the Apify Store in September 2026: the most used one charges about US$ 3.70 per 1,000 and includes owner emails; others charge US$ 4 to US$ 50 per 1,000, often plus a start fee per run. A search for 1,000 communities here costs US$ 3.

### How to use it

#### From the Console

Type a keyword, pick filters, press Start. Results appear in the dataset tab while the run goes.

#### Via API

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapewise~skool-communities/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["real estate"], "price": "paid", "maxItems": 50}'
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("scrapewise/skool-communities").call(
    run_input={"searchQueries": ["fitness"], "minMembers": 500, "maxItems": 100}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["name"], row["members"], row["priceText"])
```

#### With AI agents (MCP)

The Actor works through the Apify MCP server, so Claude, Cursor or any MCP client can call it: "list the 50 biggest paid Skool communities about sales and their monthly prices". The input is simple JSON and the output is flat, which keeps tool calls short.

#### Scheduling and integrations

Create a Task with your search, add a weekly schedule and connect the dataset to Google Sheets, Make, n8n, Zapier or a webhook. Comparing two weekly runs by `slug` shows member growth and price changes.

### Limits and honest notes

- **1,000 communities per search.** Skool itself stops the discovery list at 1,000 results (34 pages). To go wider, split by category, language or price, or use several keywords; duplicates are removed inside a run.
- **Category and language are the filters you used.** Skool does not publish a category or language field per community, so those columns are filled only when you filter by them.
- **Ranking is Skool's.** `trending` and `top` follow Skool's own order, which is not strictly by members; sort by `members` in your spreadsheet if you need that.
- **Owner name is the public display name,** exactly as Skool shows it. Some owners use a brand name.
- **Prices are the public list price.** Tier prices of freemium communities are not always public; then `price` is 0 and `priceType` is `freemium`.
- **Posts, members, lessons and chat are out of scope.** They require a Skool account.
- Skool uses AWS protection; the Actor rotates proxy sessions and retries. In tests, 30 of 404 requests were retried and every one recovered.

If something breaks, open an issue on the Actor page. Issues are answered within 12 hours.

### FAQ

**Does this Skool scraper need a Skool account or cookies?**
No. It reads the public discovery directory and public about pages only.

**Does it return the owner's email or phone number?**
No, never. Only the owner's public display name and profile link. Emails and phones found inside descriptions are removed.

**Can I get the member list of a community?**
No. Member lists sit behind a login and are personal data. This Actor gives the member count only.

**How many Skool communities can I get?**
Up to 1,000 per search, which is Skool's own limit. Splitting by the 9 categories, by language or by free and paid gives several thousand distinct communities.

**How fresh is the data?**
Live. Every run reads Skool at that moment; `scrapedAt` shows the time.

**What is the difference between `search` and `communities` mode?**
`search` lists communities from the discovery directory with filters. `communities` reads the about page of the communities you already know.

**How is `monthlyPriceEquivalent` calculated?**
The monthly price when there is one, otherwise the annual price divided by 12, and 0 for free communities. Use it to sort or filter by price.

**Why do some rows have `rating: null`?**
The community has no reviews yet, or the owner has not enabled them.

**Can I use field names from another Skool scraper?**
Yes. `searchTerms`, `maxCommunities`, `query`, `maxResults`, `urls`, `membership` and others are accepted, so you can switch without rewriting your code.

**Is scraping Skool legal?**
This Actor collects only data Skool shows publicly to any visitor, with no login and no personal contact data. You are responsible for how you use the data; follow the laws that apply to you, including privacy laws.

**How much does a typical run cost?**
A search for 30 communities costs US$ 0.09. A run of 1,000 communities costs US$ 3.

### Changelog

- **0.1 (September 2026):** first release. Search mode with keyword, category, language, price, type, sort, minimum members and price range; communities mode by URL or slug; about page details included; owner limited to display name and profile link; email and phone removal in free text; field names from other Skool scrapers accepted; errors returned as free rows.

### Em português

**Skool Communities Scraper** coleta o diretório público de comunidades do Skool: nome, link, descrição, membros, preço mensal, cursos, avaliação e nome público do dono, sem login e sem e-mail. Serve para pesquisa de mercado de comunidades, para criadores avaliando nicho e preço antes de lançar, e para agências que acompanham comunidades pagas. Preço: US$ 3 por 1.000 comunidades, sem mensalidade.

This Actor collects only public data and respects the site's terms.

Keywords: skool scraper, skool communities scraper, skool community scraper, skool discovery scraper, skool groups scraper, skool directory, skool community list, skool pricing, skool members count, skool market research, skool api, scrape skool

# Actor input Schema

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

'search' lists communities from skool.com/discovery with filters. 'communities' reads the public about page of the communities you list. If you send only URLs or slugs, the Actor switches to 'communities' by itself.

## `searchQueries` (type: `array`):

For 'search': each keyword is searched on the Skool discovery page (up to 1,000 communities per keyword, Skool's own limit). Leave empty to list the whole directory with the filters below. Also accepted by API as searchTerms, queries, query or searchQuery.

## `startUrls` (type: `array`):

For 'communities': skool.com/<slug>, skool.com/<slug>/about or just the slug. A skool.com/discovery URL with filters also works and runs as a search. Also accepted by API as communityUrls, communityUrl, urls or communities.

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

Skool discovery category: hobbies, music, money, spirituality, tech, health, sports, self\_improvement or relationships. Empty means all. By API you can also send 'categories' as a list; each category runs as its own slice of the directory. An unknown category returns a free INVALID\_CATEGORY row.

## `language` (type: `string`):

Community language as Skool names it (english, spanish, portuguese, german, french...) or a two-letter code (EN, ES, PT). Empty means all languages.

## `price` (type: `string`):

Skool's own price filter. Also accepted by API as membership, or paidOnly: true.

## `communityType` (type: `string`):

Skool's filter for public or private communities (private means posts need membership; the about page is always public).

## `sortBy` (type: `string`):

Order of the discovery directory. Skool ignores the order when a keyword is searched and uses relevance.

## `minMembers` (type: `integer`):

Skip communities with fewer members. Paging continues until maxItems communities pass the filter.

## `minPriceUsd` (type: `integer`):

Keep only communities whose monthly price is at least this value (annual prices are divided by 12). Free communities count as 0.

## `maxPriceUsd` (type: `integer`):

Keep only communities whose monthly price is at most this value.

## `includeDetails` (type: `boolean`):

Adds courses, modules, rating, review count, online members, posts, creation date, full about text and owner display name to each search result. One extra light request per community, same price.

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

For 'search': maximum communities per keyword (or per category slice). Skool shows at most 1,000 per search. Also accepted by API as maxCommunities or maxResults.

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

Apify datacenter proxy is the default. Blocked requests are retried on a new IP.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "marketing"
  ],
  "price": "all",
  "communityType": "all",
  "sortBy": "trending",
  "minMembers": 0,
  "includeDetails": true,
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "mode": "search",
    "searchQueries": [
        "marketing"
    ],
    "category": "",
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/skool-communities").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 = {
    "mode": "search",
    "searchQueries": ["marketing"],
    "category": "",
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/skool-communities").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 '{
  "mode": "search",
  "searchQueries": [
    "marketing"
  ],
  "category": "",
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/skool-communities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/skool-communities"
        }
    }
}
```

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/VtfYsHpyt1VwfsiV9/builds/wdrsKA3TbnqOHcGLu/openapi.json
