# Skool Group Leads — Community Owner Contact Enrichment | PPE (`bovi/skool-group-leads`) Actor

Enrich a list of Skool.com community (group) URLs with member count, category, description, owner identity and social links, plus a best-effort contact email resolved from already-public signals. Pay per group delivered.

- **URL**: https://apify.com/bovi/skool-group-leads.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $43.65 / 1,000 group leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Skool Group Leads

Enrich a list of **Skool.com** community ("group") URLs with member stats, category, description, owner identity and social links — plus a best-effort **contact email** resolved only from signals that are already public, never guessed or invented.

### Why this actor

Skool.com hosts thousands of paid and free online communities. The best-known existing Skool scraper reliably returns member counts and descriptions, but its own live-tasted output has two confirmed gaps:

- **Owner contact email** — the field is present in the data model but comes back empty for essentially every group when viewed as a logged-out visitor.
- **Monthly price** — filled for only a small minority of sampled groups, because Store discovery mostly surfaces free communities.

This actor is built around closing the first gap honestly (see **Contact-email wedge** below) and reporting the second gap for what it actually is, rather than papering over it.

### Features

- **Rich group profile** — name, slug, URL, member count, online-member count, admin count, post/course/module counts, human-readable category names, plan tier, membership model, privacy setting, logo/cover images, creation/update timestamps.
- **Owner identity** — name, bio, location, and every social link Skool exposes (website, Twitter/X, Instagram, LinkedIn, Facebook, YouTube).
- **Contact-email wedge** — see below.
- **No login required** — every field comes from Skool's own public, anonymous-visitor "about" page.
- **Pay per group delivered** — PPE pricing; a run that finds nothing charges nothing.

### Contact-email wedge — how it works, and the honest fill rate

Skool's own owner-profile object has an `email` slot, but it is **always blank** for an anonymous visitor — this is a structural gap in the source, not something any scraper can extract around without a login the buyer would have to supply (which this actor never asks for). Instead, this actor looks for contact signals that are already sitting in public view:

1. **The group's own about page** — scanned for a visible `mailto:` link first, then a plain email-looking string in the page text (excluding Skool's own support address, which shows up on every page's footer regardless of which group you're looking at).
2. **One extra hop, only if step 1 finds nothing** — if the group owner has linked their own external website (not another Skool page), that ONE page is fetched and scanned the same way. No further links on that page are followed — this is a single hop, not a crawl.

**Confirmed fill rate from a real 5-group cloud test run (2026-07-20):** 1/5 groups (20%) yielded a real, verified contact email this way — found via the external-site hop (`connect@evelyn-weiss.com`, matching the real owner's name, from her linked coaching-site landing page). 0/5 had a mailto/email visible directly on the Skool about page itself. This is genuinely better than the champion's ~0% (structural email field always blank), but it will not be 100% — most group owners simply haven't put a public email anywhere reachable in one hop. The field is left empty rather than guessed whenever nothing is found; `contact_email_source` and `contact_email_confidence` always tell you exactly where a filled value came from.

### Known, confirmed gap: `monthly_price`

Live testing across multiple groups (free and a known high-revenue paid mastermind) found **no server-side field anywhere** in the anonymous "about" page payload that carries the actual membership price — Skool renders join pricing client-side, after a paywall check, for logged-out visitors. `monthly_price` is always returned as `null` by this actor. This matches (does not improve on) the champion's own confirmed weak spot on this specific field; we report it honestly rather than fabricate a number. Everything else in this actor's output is at or above the champion's field depth.

### Access note: why groups are supplied by URL, not by category browsing

Skool's discovery/category browsing pages are protected by a bot-detection challenge that cannot be solved without a full browser (out of scope for this actor's zero-cost build). Individual group "about" pages are **not** behind this protection at all — they load cleanly and instantly. So this actor takes an explicit list of group URLs or slugs (competitor communities you already know about, or a list gathered from your own research/Google/YouTube/etc.) rather than crawling Skool's own directory.

### How to Use

1. Open the actor in Apify Store and click **Try for free**.
2. Set `groupUrls` — a list of Skool group URLs or bare slugs, e.g. `["https://www.skool.com/educate/about", "make-money"]`.
3. Leave `resolveContactEmail` on (default) to run the contact-email wedge, or turn it off for a faster run if you only need group stats.
4. Adjust `maxItems` to cap output.
5. Leave the proxy on the default **Apify RESIDENTIAL** group — required for reliable access.
6. Click **Start** and collect results from the **Dataset** tab.

### Input Example

```json
{
  "groupUrls": ["https://www.skool.com/educate/about", "make-money", "skoolers"],
  "maxItems": 100,
  "resolveContactEmail": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
````

### Output Example

```json
{
  "slug": "make-money",
  "group_url": "https://www.skool.com/make-money/about",
  "group_name": "make-money",
  "display_name": "Skool Growth Free Training Hub",
  "description": "All my free Skool trainings, strategies, templates & resources in one place...",
  "member_count": 8904,
  "category_names": ["Admin & Help"],
  "plan_tier": "pro",
  "monthly_price": null,
  "owner_name": "evelyn",
  "owner_bio": "Running Meta Ads for Skool & Skool creators...",
  "owner_link_website": "https://www.coachgrowthhub.com/cgh-259676031",
  "contact_email": "connect@evelyn-weiss.com",
  "contact_email_source": "external_site_mailto",
  "contact_email_confidence": "high",
  "scraped_at": "2026-07-20T09:50:20Z"
}
```

(Real, non-synthetic record — one of the 5 pulled in the pre-publish cloud test run.)

### Pricing

Informational only — pricing is set separately by the Store listing, not by this actor's code.

Proposed: **$0.049 per group record delivered** (`group-lead` event) — a charm-undercut against the known champion actor's $0.05/result price point, for a comparable-or-richer field set plus the contact-email wedge the champion doesn't have.

### Use Cases

- **Lead generation** — find and contact owners of communities in your niche for partnerships, sponsorships, or cross-promotion.
- **Competitive research** — track member counts, categories, and growth signals of rival communities over time.
- **Market mapping** — build a directory of active Skool communities in a given topic area.
- **Outreach list building** — combine with the contact-email wedge to build a warm outreach list of community owners who have a public contact path.

### FAQ

**Does this actor need a Skool account or login?**
No. Every field comes from Skool's own public, logged-out "about" page.

**Will I get a contact email for every group?**
No — see the honest fill-rate disclosure above. About 1 in 5 groups yields a real public email through this method; the rest are left empty, never guessed.

**Why isn't `monthly_price` filled in?**
Skool doesn't expose it to logged-out visitors anywhere server-side — confirmed across both free and high-revenue paid groups. See the dedicated section above.

**Can I browse Skool's discovery/category pages with this actor?**
Not in this version — see "Access note" above. Supply the group URLs you want enriched directly.

# Actor input Schema

## `groupUrls` (type: `array`):

List of Skool.com group URLs or bare slugs to enrich, e.g. 'https://www.skool.com/educate/about' or just 'educate'. One record is returned (and charged) per group found.

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

Maximum number of group records to return.

## `resolveContactEmail` (type: `boolean`):

Try to find a public contact email for each group's owner (checks the about page for a visible mailto: link or email text, and — as a single extra hop — the owner's own linked external website if one is listed). Never guesses; leaves the field empty when no public email is found.

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

Proxy settings. Apify Proxy with the RESIDENTIAL group is required for reliable access to Skool.com.

## Actor input object example

```json
{
  "groupUrls": [
    "https://www.skool.com/educate/about"
  ],
  "maxItems": 100,
  "resolveContactEmail": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing Skool Group Leads records (group\_name, slug, member\_count, owner\_name, contact\_email, and more).

# 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 = {
    "groupUrls": [
        "https://www.skool.com/educate/about"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/skool-group-leads").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 = {
    "groupUrls": ["https://www.skool.com/educate/about"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/skool-group-leads").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "groupUrls": [
    "https://www.skool.com/educate/about"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call bovi/skool-group-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=bovi/skool-group-leads",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Skool Group Leads — Community Owner Contact Enrichment | PPE",
        "description": "Enrich a list of Skool.com community (group) URLs with member count, category, description, owner identity and social links, plus a best-effort contact email resolved from already-public signals. Pay per group delivered.",
        "version": "0.1",
        "x-build-id": "djug9oRFaQgdT7tpF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bovi~skool-group-leads/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bovi-skool-group-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/bovi~skool-group-leads/runs": {
            "post": {
                "operationId": "runs-sync-bovi-skool-group-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/bovi~skool-group-leads/run-sync": {
            "post": {
                "operationId": "run-sync-bovi-skool-group-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "groupUrls"
                ],
                "properties": {
                    "groupUrls": {
                        "title": "Group URLs or slugs",
                        "type": "array",
                        "description": "List of Skool.com group URLs or bare slugs to enrich, e.g. 'https://www.skool.com/educate/about' or just 'educate'. One record is returned (and charged) per group found.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max groups total",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of group records to return.",
                        "default": 100
                    },
                    "resolveContactEmail": {
                        "title": "Resolve contact email",
                        "type": "boolean",
                        "description": "Try to find a public contact email for each group's owner (checks the about page for a visible mailto: link or email text, and — as a single extra hop — the owner's own linked external website if one is listed). Never guesses; leaves the field empty when no public email is found.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Apify Proxy with the RESIDENTIAL group is required for reliable access to Skool.com."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
