Base URL: https://skool-scraper-production-c8a8.up.railway.app
A REST API for scraping member data from Skool communities. Jobs run asynchronously - you create a job, poll for status, then retrieve results when complete.
Admin-only data: When scraping as a community admin, you get access to additional fields like email, role, LTV, and survey answers.
GET /health
Check if the API is running.
Response: 200 OK
{
"status": "ok",
"timestamp": "2026-01-30T22:26:14.776Z"
}POST /jobs
Start a new community member scraping job.
Request Headers:
Content-Type: application/json
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
communityUrl |
string | Yes | Full Skool community URL (e.g., https://www.skool.com/community-name) |
cookies |
string or array | Yes | Authentication cookies (see Cookie Formats below) |
Cookie Formats:
The API accepts cookies in two formats:
Format 1: Cookie Header String (Recommended)
{
"communityUrl": "https://www.skool.com/your-community",
"cookies": "auth_token=eyJhbGci...; client_id=70d1b674..."
}Format 2: Cookie Editor Array (Browser Extension Export)
{
"communityUrl": "https://www.skool.com/your-community",
"cookies": [
{ "name": "auth_token", "value": "eyJhbGci...", "domain": ".skool.com" },
{ "name": "client_id", "value": "70d1b674...", "domain": ".skool.com" }
]
}Example Request:
curl -X POST https://skool-scraper-production-c8a8.up.railway.app/jobs \
-H "Content-Type: application/json" \
-d '{
"communityUrl": "https://www.skool.com/your-community",
"cookies": "auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}'Response: 202 Accepted
{
"jobId": "2ce1caa0-91e0-435c-801c-bd23e6bdf881",
"status": "pending",
"statusUrl": "/jobs/2ce1caa0-91e0-435c-801c-bd23e6bdf881"
}GET /jobs/:id
Check the status of a scraping job.
Response: 200 OK
{
"jobId": "2ce1caa0-91e0-435c-801c-bd23e6bdf881",
"status": "complete",
"createdAt": "2026-01-30T22:26:38.565Z",
"startedAt": "2026-01-30T22:26:38.566Z",
"completedAt": "2026-01-30T22:51:47.618Z",
"hasResults": true
}Job Status Values:
| Status | Description |
|---|---|
pending |
Job created, waiting to start |
running |
Job is actively scraping |
complete |
Job finished successfully |
failed |
Job failed (may have partial results) |
GET /jobs/:id/results
Retrieve the scraped member data.
Response: 200 OK
{
"members": [
{
"name": "John Doe",
"username": "john-doe-1234",
"profileUrl": "https://www.skool.com/@john-doe-1234?g=community",
"avatarUrl": "https://assets.skool.com/...",
"memberSince": "2024-01-15T00:00:00.000Z",
"bio": "Community member bio text",
"location": "New York, USA",
"level": 5,
"socialLinks": {
"twitter": "https://twitter.com/johndoe",
"linkedin": "https://linkedin.com/in/johndoe"
},
"email": "john@example.com",
"role": "group-member",
"points": 1250,
"invitedBy": {
"userId": "abc123",
"name": "Jane Smith",
"username": "jane-smith-5678"
},
"surveyAnswers": [
{ "question": "What's your email?", "answer": "john@example.com" },
{ "question": "What do you need help with?", "answer": "Growing my business" }
]
}
],
"totalCount": 447,
"scrapedAt": "2026-01-30T22:51:47.618Z",
"partial": false
}Member Object Fields:
| Field | Type | Description | Admin Only |
|---|---|---|---|
name |
string | Display name | No |
username |
string | Skool username | No |
profileUrl |
string | Full profile URL | No |
avatarUrl |
string? | Profile image URL | No |
memberSince |
string? | ISO date when joined | No |
bio |
string? | Member bio/description | No |
location |
string? | Location if provided | No |
level |
number? | Community level (1-9) | No |
socialLinks |
object? | Social media links | No |
email |
string? | Member's email address | Yes |
role |
string? | Role: group-owner, group-admin, group-moderator, group-member |
Yes |
points |
number? | Engagement points | Yes |
ltv |
number? | Lifetime value in cents | Yes |
invitedBy |
object? | Who invited the member | Yes |
surveyAnswers |
array? | Answers to join survey | Yes |
Note: Admin-only fields are only populated when scraping as a community admin/owner.
# 1. Create job
JOB_RESPONSE=$(curl -s -X POST https://skool-scraper-production-c8a8.up.railway.app/jobs \
-H "Content-Type: application/json" \
-d '{"communityUrl":"https://www.skool.com/your-community","cookies":"auth_token=..."}')
JOB_ID=$(echo $JOB_RESPONSE | grep -o '"jobId":"[^"]*"' | cut -d'"' -f4)
# 2. Poll status (wait for complete)
curl -s https://skool-scraper-production-c8a8.up.railway.app/jobs/$JOB_ID
# 3. Get results when complete
curl -s https://skool-scraper-production-c8a8.up.railway.app/jobs/$JOB_ID/results- Log into Skool in your browser
- Open Developer Tools (F12) → Network tab
- Navigate to your community
- Find any request to
skool.com - Copy the
Cookieheader value
- Install "Cookie Editor" browser extension
- Log into Skool
- Click the extension → Export as JSON
- Pass the entire array directly to the API
Required Cookie: auth_token (the JWT session token)
| Access Level | Members Visible | Admin Fields |
|---|---|---|
| Admin/Owner | ALL members (with pagination) | ✓ email, role, points, ltv, invitedBy, surveyAnswers |
| Non-Admin | ~30 members only | ✗ None |
- Jobs are stored in-memory and will be lost on server restart
- Large communities may take several minutes to scrape
- Typical scrape time: ~10-15 seconds for communities under 500 members
- Failed jobs may still have partial results