← 返回
未分类 Key 中文

Skool All-in-One API

Full read AND write access to Skool communities. Use when user asks to manage Skool members (approve, reject, list pending), read or create posts, reply to c...
完整读写Skool社区,用于管理成员(批准、拒绝、待处理列表)、读取或发布帖子、回复评论。
ctala ctala 来源
未分类 clawhub v1.0.0 1 版本 100000 Key: 需要
★ 0
Stars
📥 322
下载
💾 0
安装
1
版本
#latest

概述

Skool All-in-One API

Full read AND write access to Skool communities via Apify.

Prerequisites

  • .env file with APIFY_TOKEN
  • Node.js 20.6+
  • mcpc CLI tool

CRITICAL: Skool Data Model

Posts and comments are the SAME object in Skool.

  • To read comments: use posts:getComments — NOT comments:list
  • To create a comment: use posts:createComment — NOT comments:create
  • There is NO comments: namespace. Everything is posts:.

Content is PLAIN TEXT, not HTML.

  • CORRECT: Hello world
  • WRONG:

    Hello world

User mentions: @Display Name

Workflow

Copy this checklist and track progress:

Task Progress:
- [ ] Step 1: Determine action needed
- [ ] Step 2: Login (auth:login) or use existing cookies
- [ ] Step 3: Execute the action
- [ ] Step 4: Present results

Step 1: Determine Action

Select the action based on user needs:

User NeedActionParams
---------------------------
Authentication
Login to Skoolauth:loginemail, password, groupSlug
Posts
List postsposts:listpage?, sortType?
Filter posts (date, unanswered)posts:filtersince?, until?, notAnsweredBy?, maxPosts?
Get single postposts:getpostId
Create postposts:createtitle, content (plain text), labelId?
Edit post or commentposts:updatepostId, title?, content?
Delete post or commentposts:deletepostId
Pin/unpin postposts:pin / posts:unpinpostId
Like/unlikeposts:votepostId, vote ("up" or "")
Comments
Get comments (nested tree)posts:getCommentspostId
Reply to postposts:createCommentcontent, rootId=postId, parentId=postId
Reply to comment (nested)posts:createCommentcontent, rootId=postId, parentId=commentId
Members
List membersmembers:listpage?
List pending applicationsmembers:pending(none)
Approve membermembers:approvememberId (use member.memberId, NOT member.id)
Reject membermembers:rejectmemberId
Ban membermembers:banmemberId
Events
List calendar eventsevents:list(none)
List upcoming eventsevents:upcoming(none)

Step 2: Authentication

Recommended flow (fast):

  1. Run auth:login once to get cookies
  2. Use cookies in all subsequent calls (~2s each instead of ~10s)
  3. Cookies expire every ~3.5 days — re-login when you get auth errors
# Login and get cookies
export $(grep APIFY_TOKEN .env | xargs)
RESULT=$(curl -s -X POST "https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/runs?token=$APIFY_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "auth:login",
    "email": "USER_EMAIL",
    "password": "USER_PASSWORD",
    "groupSlug": "GROUP_SLUG"
  }')

RUN_ID=$(echo $RESULT | jq -r '.data.id')
COOKIES=$(curl -s "https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items?token=$APIFY_TOKEN" | jq -r '.[0].cookies')
echo "Cookies saved. Valid for ~3.5 days."

Step 3: Execute Action

With cookies (fast, ~2s):

export $(grep APIFY_TOKEN .env | xargs)
curl -s -X POST "https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/runs?token=$APIFY_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "ACTION_NAME",
    "cookies": "COOKIES_FROM_LOGIN",
    "groupSlug": "GROUP_SLUG",
    "params": { PARAMS_HERE }
  }'

With email+password (slower, ~10s, uses Playwright):

export $(grep APIFY_TOKEN .env | xargs)
curl -s -X POST "https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/runs?token=$APIFY_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "ACTION_NAME",
    "email": "USER_EMAIL",
    "password": "USER_PASSWORD",
    "groupSlug": "GROUP_SLUG",
    "params": { PARAMS_HERE }
  }'

Get results from dataset:

RUN_ID=$(echo $RESULT | jq -r '.data.id')
curl -s "https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items?token=$APIFY_TOKEN" | jq .

Step 4: Present Results

Format results based on the action:

  • posts:list — Show title, author, likes, commentCount, url
  • posts:getComments — Show nested comment tree with replies
  • members:pending — Show name, bio, location, application answers, source
  • members:list — Show name, level, points, bio, social links

Common Workflows

Get unanswered posts from last 7 days

To find which posts the user hasn't replied to, you need their Skool user ID.

1. auth:login → save cookies
2. members:list → find the user by name/email → get their "id" field (this is the user ID, NOT memberId)
3. posts:filter with params:
   {
     "since": "2026-03-20T00:00:00Z",
     "notAnsweredBy": "USER_ID_FROM_STEP_2",
     "maxPosts": 50
   }
4. Show the filtered posts — these are posts the user has NOT replied to

How to get USER_ID: Run members:list and find the user by firstName/lastName. The id field (NOT memberId) is what you pass to notAnsweredBy.

Alternative — just get posts with 0 comments:

1. auth:login → save cookies
2. posts:list with params: { "page": 1 }
3. Filter results where commentCount === 0

Approve pending members

1. auth:login → save cookies
2. members:pending → get list with application answers
3. For each member to approve: members:approve with params: { "memberId": member.memberId }
IMPORTANT: Use member.memberId (membership ID), NOT member.id (user ID)

Reply to a post with user mention

1. auth:login → save cookies
2. posts:createComment with params:
   - content: "Great point [@Name](obj://user/{userId})! I agree with your analysis."
   - rootId: "post-id"
   - parentId: "post-id" (same as rootId for top-level comment)

Reply to a specific comment (nested)

1. posts:getComments → find the comment ID
2. posts:createComment with params:
   - content: "Thanks for sharing!"
   - rootId: "original-post-id" (ALWAYS the root post, never a comment)
   - parentId: "comment-id" (the comment you're replying to)

Important Notes

  1. memberId vs id: For approve/reject/ban, use memberId field (membership ID), NOT id (user account ID). They are different.
  2. Content format: Posts and comments use PLAIN TEXT. Never send HTML tags.
  3. Mentions: Use @Name format. Get userId from members:list.
  4. Rate limits: Skool limits writes to ~20-30/min. Reads are ~60/min.
  5. Cookie expiry: Cookies last ~3.5 days. Re-login when you get 403 errors.
  6. Comment nesting: rootId is ALWAYS the original post ID. parentId is the post (for top-level) or comment (for nested reply).

Actor Details

  • Actor: cristiantala~skool-all-in-one-api
  • Actor ID: g2VGrINIS7pb8t2bs
  • Apify Store: https://apify.com/cristiantala/skool-all-in-one-api

版本历史

共 1 个版本

  • v1.0.0 当前
    2026-05-07 15:49 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

business-ops

Discord

steipete
当需要通过discord工具控制Discord时使用:发送消息、添加反应、发布或上传表情包、上传表情、创建投票、管理帖子/置顶/搜索、获取权限或成员/角色/频道信息,或在Discord私信或频道中处理管理操作。
★ 79 📥 38,070
business-ops

Trello

steipete
使用 Trello REST API 管理看板、列表和卡片
★ 162 📥 41,314
business-ops

Stripe

byungkyu
Stripe API 集成,支持托管 OAuth,实现对客户、订阅、发票、产品、价格和支付的可写金融集成。
★ 27 📥 26,048