Skool Content Scraper — Posts, Comments & Classroom
Pricing
from $5.00 / 1,000 skool content items
Skool Content Scraper — Posts, Comments & Classroom
Scrape public Skool posts, nested comments, classroom lessons, media links, authors, and engagement. Use for research, course archives, RAG, and monitoring. Not for members, emails, private content, write actions, or downloads. Returns flat post/comment/lesson rows with parent and depth. $0.005/row.
Pricing
from $5.00 / 1,000 skool content items
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Extract public Skool community posts, full nested comment threads, classroom lessons, videos, images, attachments, authors, and engagement as clean JSON rows. Skool Content Scraper is built for community operators, course owners, researchers, and AI/RAG pipelines that need structured Skool content without running a browser.
The Actor returns one row per post, comment, or lesson. Nested comments remain reconstructable through rootPostId, parentCommentId, and depth, while media stays attached to the content that contains it. This flat shape is friendly to CSV exports, databases, Apify MCP, Claude, ChatGPT, and downstream vector pipelines.
Price: $0.005 per stored result ($5 per 1,000) plus a $0.00005 Actor-start event. A hard maxResults cap is displayed before each run, so the maximum event charge is predictable.
What data can I extract with Skool Content Scraper?
| Data | Output fields |
|---|---|
| Community posts | itemId, title, text, categoryId, upvotes, commentCount, isPinned |
| Nested comments | rootPostId, parentCommentId, depth, text, upvotes |
| Classroom lessons | courseId, courseTitle, lessonOrder, title, text, hasAccess |
| Media and files | mediaType, url, thumbnailUrl, durationMs, provider, fileName, contentType |
| Authors | authorId, authorName, authorUsername, profile and avatar URLs |
| Detailed profiles | public bio, location, website, LinkedIn, X/Twitter, Instagram, YouTube, Facebook |
| Timestamps | createdAt, updatedAt, scrapedAt in ISO 8601 |
| Diagnostics | OUTPUT KV record with counts, warnings, completion status, and billing totals |
All record types use the same stable schema. Missing values are explicit null values, not changing or invented fields.
Use cases for public Skool data
- Archive a community you own or content you are authorized to process.
- Build a searchable knowledge base from posts, replies, and course lessons.
- Study which topics, questions, and lessons receive the most engagement.
- Monitor new content with
postedAfterand an Apify Schedule. - Export classroom video and resource links for an internal content inventory.
- Feed flat, typed discussion rows into sentiment, topic, or support analysis.
- Preserve reply relationships for thread visualization or conversation analytics.
Do not use this Actor for member lists, emails, DMs, private communities, write actions, or binary video downloading. It extracts links and public metadata; it does not bypass access controls.
How the nested comment output works
Each comment is its own result. A top-level comment has depth: 0 and parentCommentId: null. A reply has depth: 1 and points to its immediate parent. Deeper replies continue the same pattern. Every comment also carries the root conversation ID in rootPostId.
This representation avoids very large post objects, keeps each MCP item compact, and makes pagination and billing transparent. Reconstruct a tree by indexing comments by itemId and attaching each reply to parentCommentId.
Input
The default input is a small health-check run against a public community:
{"startUrls": [{ "url": "https://www.skool.com/ai-automation-society" }],"scrapeMode": "all","maxResults": 200,"maxPostsPerGroup": 25,"includeComments": true,"maxCommentsPerPost": 50,"maxCommentDepth": 20,"maxLessonsPerGroup": 100,"postedAfter": "","includeMedia": true,"responseFormat": "concise"}
scrapeMode accepts all, community, or classroom. maxResults is the hard combined row and PPE cap. The per-group post, comment, and lesson limits control how that budget is spent. Use responseFormat: "concise" for AI agents and detailed when public author bios and social links are useful.
For daily delta runs, pass an ISO date:
{"startUrls": [{ "url": "https://www.skool.com/ai-automation-society" }],"scrapeMode": "community","postedAfter": "2026-07-01T00:00:00Z","maxResults": 500}
Output
Example nested reply row:
{"contentType": "comment","itemId": "01d5f6f76b954f17be8aee82c2c2f11e","communitySlug": "ai-automation-society","sourceUrl": "https://www.skool.com/ai-automation-society?c=01d5f6f...","title": null,"text": "I should watch the summary of this instead","rootPostId": "be3fc044cfd54901b86e4d9753948f66","parentCommentId": "c7af89b3b4b046bc8ec5660f81ee51d9","depth": 1,"authorName": "Example Member","upvotes": 2,"media": [],"createdAt": "2026-07-11T13:05:30.711Z","scrapedAt": "2026-07-13T10:00:00.000Z","warnings": []}
The Actor also writes OUTPUT to the default key-value store. It reports post, comment, and lesson counts, completed communities, warnings, charged event count, estimated event charge, and the deployed build number.
How much will scraping Skool cost?
| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Stored post, comment, or lesson | $0.005 |
| 100 results | $0.50 plus start |
| 1,000 results | $5.00 plus start |
The Actor charges only after a schema-valid result is stored. maxResults: 200 caps the result-event portion at $1.00. If the run-level PPE budget is lower, the Actor stops gracefully and preserves partial results.
API examples
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('YOUR_USERNAME/skool-content-scraper').call({startUrls: [{ url: 'https://www.skool.com/ai-automation-society' }],scrapeMode: 'community',maxResults: 100,includeComments: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("YOUR_USERNAME/skool-content-scraper").call(run_input={"startUrls": [{"url": "https://www.skool.com/ai-automation-society"}],"scrapeMode": "classroom","maxResults": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["contentType"], item.get("title"), item["sourceUrl"])
The hosted Apify MCP server can expose the Actor as a tool. Use it when an AI agent needs public Skool discussions or classroom content. Do not use it for Skool member/email scraping or for actions such as posting, commenting, or direct messaging. Returned rows contain the exact public content types described above, billed at $0.005 per row.
Reliability and limits
The Actor uses Skool’s server-rendered JSON and public comments endpoint instead of browser automation. It retries temporary network, 403, 429, and 5xx responses with bounded backoff; validates stable required fields; stores partial results when one course or comment thread fails; and records all non-fatal problems in OUTPUT.warnings.
Only content visible to a logged-out public session is part of the Store contract. Private, paid, or level-locked content can legitimately return no rows or hasAccess: false. An operator running a private internal copy may configure SKOOL_COOKIE as a secret environment variable for content their account is authorized to access, but credentials are never accepted in normal Actor input, stored in datasets, or written to logs.
Media extraction returns URLs and metadata only. Signed or provider-hosted URLs may expire, and providers such as Loom, YouTube, Vimeo, Wistia, Mux, or Skool’s asset CDN control playback and download permissions. The Actor does not copy or rehost media files.
Legal and responsible use
This Actor is independent and is not affiliated with, endorsed by, or sponsored by Skool. Skool is a trademark of its owner. You are responsible for confirming that your collection and use comply with Skool’s terms, copyright rules, privacy laws, community agreements, and the rights of content authors. Process only public content or content you are authorized to access. Do not use the output for harassment, spam, unauthorized redistribution, or unlawful profiling. When personal data is involved, establish a lawful basis, minimize collection, secure the output, and honor deletion or access requests where applicable.
FAQ
Does it scrape full nested comments?
Yes. Replies are flattened into separate rows with rootPostId, parentCommentId, and depth, so the complete thread can be rebuilt.
Does it download classroom videos?
No. It extracts the public video URL, provider, thumbnail, and duration when Skool exposes them. Binary download and rehosting are intentionally out of scope.
Does it need a Skool login?
No for public communities and public classroom lessons. The public Store contract does not promise private or paid content.
Can I run it on a schedule?
Yes. Combine an Apify Schedule with postedAfter for bounded delta runs. Use the last successful timestamp as the next run’s threshold.
Why are some comments or lessons missing?
The content may be private, deleted, outside the selected date/depth/result cap, or unavailable to a logged-out session. Check OUTPUT.warnings, the terminal status message, and hasAccess before retrying.
Where do I report a problem?
Open an issue on the Actor page and include the run ID, public community URL, scrape mode, and limits. Never include cookies or other credentials in an issue.