Use Skool Community Directory, Pricing & Member Finder with Python
Browse Skool's public community directory by category, pull pricing and member-count details for communities you already know, and list top members visible on a public community page.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"category": "",
"categorySlug": "all",
"communityType": "all",
"enrichDetails": true,
"includeReviews": false,
"isFree": false,
"language": "all",
"maxItems": 3,
"maxMembersPerCommunity": 30,
"memberScope": "all",
"mode": "discover",
"priceType": "all",
"searchQueries": [
"ai"
],
"slugs": [],
"sortBy": "trending",
"startUrls": []
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to scrape: discover communities from the directory, get details for specific communities, or list visible members. |
searchQueries | array | optional | Keywords to search the Skool directory for, e.g. ["ai automation", "fitness"]. Leave empty to browse the selected category and sort order. |
startUrls | array | optional | Skool community URLs, e.g. https://www.skool.com/the-skool-of-life. |
slugs | array | optional | Community slugs from the Skool URL, e.g. ["the-skool-of-life", "buildwithskool"]. Alternative to startUrls. |
categorySlug | string | optional | Browse one of Skool's nine directory categories, or all categories. Filtering by category also fills the category fields on each community. |
priceType | string | optional | Filter communities by membership price: free, paid, or free trial. |
category | string | optional | Deprecated alias for categorySlug kept so saved tasks keep working. categorySlug takes precedence when both are set. |
isFree | boolean | optional | Deprecated alias for priceType=free kept so saved tasks keep working. priceType takes precedence when set. |
communityType | string | optional | Filter the directory by public or private communities. |
language | string | optional | Filter the directory by the community's language. |
sortBy | string | optional | Order the directory by trending or by all-time popularity. Legacy popular/new values are accepted. |
minMembers | integer | optional | Only keep communities with at least this many members. |
maxMembers | integer | optional | Only keep communities with at most this many members. |
enrichDetails | boolean | optional | Open each discovered community to add pricing, owner, rating, review and roster fields. |
includeReviews | boolean | optional | Add the latest public reviews (up to five) to each community record. |
memberScope | string | optional | Which public member tab to read: the default members list, the online list, the admin list, or all three combined. |
maxItems | integer | optional | Maximum number of records to emit (communities or members combined). |
maxMembersPerCommunity | integer | optional | Maximum public members to emit per community. Skool exposes about 30 rows per tab plus the admin and online tabs. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/9EPFdk1OYOKL8zvqC/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Public Skool community records with pricing, owner, rating, review and roster fields, plus public member records.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build tjgDxDV8AsB1A3KHA and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.