# Outschool Listings Scraper (`piotrv1001/outschool-listings-scraper`) Actor

The Outschool Listings Scraper extracts live online class listings and details from Outschool.com, capturing class titles, prices, age and grade ranges, schedules, class sizes, ratings, reviews, teacher profiles — ideal for online-learning market research and competitor and price monitoring.

- **URL**: https://apify.com/piotrv1001/outschool-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 class listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

### 🎓 Outschool Listings Scraper

Easily extract **online class listings from Outschool** — the marketplace of 140,000+ live, teacher-led classes for kids and teens (ages 3–18). The **Outschool Listings Scraper** gathers structured data on classes, prices, schedules, ratings, and teachers, so you can analyze the online-learning market, track competitors, monitor pricing, or build your own course catalog.

Run it from the [Apify Console](https://console.apify.com/) with no code, or automate it with the **Apify API**, scheduling, and integrations (Google Sheets, Make, Zapier, Slack, and more).

### ✨ Features

-   🔎 **Keyword search** – Find classes by topic (e.g. `coding`, `spanish`, `chess`) or leave it empty to scrape the most popular classes across every subject.
-   🏷️ **Rich listing data** – Title, summary, subject, age range, price, class size, weekly meetings, duration, star rating, review count, and the teacher behind each class.
-   📅 **Live schedule info** – Number of open and upcoming sections plus the next session's start and end time.
-   📚 **Optional full details** – Toggle **Scrape full class details** to add the complete curriculum, learning goals, homework, grading policy, materials, prerequisites, and teacher credentials.
-   ⚡ **Fast & reliable** – Pulls clean, structured data directly and handles pagination automatically.
-   💸 **Pay only for what you scrape** – Transparent pay-per-result pricing with a lower rate for listings and a higher rate for full details.

### 🛠️ How to use the Outschool Listings Scraper

1. **Enter a search query** – Type a keyword such as `coding`, or leave it blank to scrape top classes across all subjects.
2. **Set the limit** – Choose how many classes to scrape with **Max items**.
3. **(Optional) Enable full details** – Turn on **Scrape full class details** to capture the entire curriculum and teacher credentials for each class.
4. **Run the Actor** – Start it and download your results as **JSON, CSV, Excel, or HTML**.

### 🔧 Input

| Field | Type | Description |
| --- | --- | --- |
| `searchQuery` | string | Keyword to search classes for. Leave empty to scrape the most popular classes across all subjects. |
| `maxItems` | integer | Maximum number of classes to scrape (default `50`). |
| `scrapeDetails` | boolean | Fetch the full detail page for each class (curriculum, policies, teacher credentials). Slower and costs more. Default `false`. |
| `proxyConfiguration` | object | Proxy settings used while scraping. |

Example input:

```json
{
    "searchQuery": "coding",
    "maxItems": 50,
    "scrapeDetails": false
}
````

### 📊 Sample output data

Each class is saved as a structured record. You can download the dataset in various formats such as JSON, CSV, Excel, or HTML.

**Listing record** (default mode):

```json
{
    "uid": "9e5e8ede-58e8-43c2-a951-9f08940d478e",
    "slugId": "YG4kOrJe",
    "title": "Python Programming for Beginners Level 1 | Live Coding Class",
    "summary": "Beginner-Friendly Python Coding! Unlock your child's potential with Python.",
    "url": "https://outschool.com/classes/python-programming-for-beginners-level-1-YG4kOrJe",
    "subject": "Coding & Tech",
    "ageMin": 10,
    "ageMax": 14,
    "priceUsd": 240,
    "weeklyMeetings": 1,
    "durationMinutes": 50,
    "classSizeMin": 1,
    "classSizeMax": 6,
    "averageStarRating": 4.91,
    "reviewCount": 373,
    "teacherName": "Einstein's Square",
    "teacherUrl": "https://outschool.com/teachers/EinsteinsSquare",
    "sectionCount": 8,
    "openSectionCount": 5,
    "nextSectionStart": "2026-08-14T16:00:00.000Z"
}
```

When **Scrape full class details** is enabled, each record additionally includes `classExperience`, `learningGoals`, `homework`, `gradingPolicy`, `materials`, `prerequisites`, `parentalGuidance`, `assessment`, `gradeLevelMin`/`gradeLevelMax`, `completedEnrollmentCount`, and the teacher's `teacherCredentials`, `teacherAverageStarRating`, and `teacherReviewCount`.

### 🗂️ Data fields

| Field | Description |
| --- | --- |
| `title` | Class title |
| `url` | Link to the class page |
| `subject` | Subject / category |
| `summary` | Short class description |
| `priceUsd` / `priceCents` | Class price |
| `ageMin` / `ageMax` | Recommended age range |
| `gradeLevelMin` / `gradeLevelMax` | Grade level range (details mode) |
| `weeklyMeetings` / `durationMinutes` / `durationWeeks` | Schedule structure |
| `classSizeMin` / `classSizeMax` | Class size |
| `averageStarRating` / `reviewCount` | Class rating and number of reviews |
| `sectionCount` / `openSectionCount` / `upcomingSectionCount` | Available class sections |
| `nextSectionStart` / `nextSectionEnd` | Next scheduled session |
| `teacherName` / `teacherUrl` | Teacher name and profile link |
| `teacherCredentials` | Teacher degrees and subjects (details mode) |
| `classExperience` / `learningGoals` / `homework` / `materials` | Full curriculum content (details mode) |

### 💰 How much does it cost to scrape Outschool?

This Actor uses a **pay-per-event** pricing model:

| Event | Price | When it's charged |
| --- | --- | --- |
| Class listing | **$0.002** | Per class scraped in default mode |
| Class detail | **$0.006** | Per class scraped with full details enabled |

There is **no per-run start fee** — you pay only for the classes you actually scrape. For example, scraping 1,000 class listings costs about **$2**, or about **$6** with full curriculum details. New Apify accounts include free monthly usage credits, so you can start testing right away.

### 💡 Tips

- Start with a small **Max items** value to preview the data before running a large scrape.
- Keep **Scrape full class details** off when you only need catalog-level data (title, price, rating, schedule) — it's faster and cheaper.
- Use a specific **search query** to target a niche (e.g. `ap calculus`, `creative writing`) instead of scraping the whole catalog.

### ❓ FAQ

**Is scraping Outschool legal?**
This Actor collects only publicly available data (class listings, prices, ratings, and public teacher profiles). No login or personal learner data is accessed. As with any scraping, you are responsible for how you use the data and for complying with Outschool's Terms of Service and applicable laws. Consider seeking legal advice for your specific use case.

**Can I schedule regular runs?**
Yes. Use Apify's scheduling to run the Actor daily, weekly, or at any interval, and connect the output to Google Sheets, Make, Zapier, and more.

**What if I need a custom field or feature?**
Open an issue on the Actor's **Issues** tab — feedback and custom requests are welcome.

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword to search classes for (e.g. "coding", "spanish", "chess"). Leave empty to scrape the most popular classes across all subjects.

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

Maximum number of classes to scrape.

## `scrapeDetails` (type: `boolean`):

Fetch the full detail page for each class (curriculum, learning goals, homework, policies, teacher credentials and more). This is slower and costs more.

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

Proxy settings used while scraping.

## Actor input object example

```json
{
  "searchQuery": "coding",
  "maxItems": 50,
  "scrapeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "searchQuery": "coding"
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/outschool-listings-scraper").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 = { "searchQuery": "coding" }

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/outschool-listings-scraper").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 '{
  "searchQuery": "coding"
}' |
apify call piotrv1001/outschool-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=piotrv1001/outschool-listings-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Outschool Listings Scraper",
        "description": "The Outschool Listings Scraper extracts live online class listings and details from Outschool.com, capturing class titles, prices, age and grade ranges, schedules, class sizes, ratings, reviews, teacher profiles — ideal for online-learning market research and competitor and price monitoring.",
        "version": "0.0",
        "x-build-id": "3EdO8ItrRrBI5iw5t"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/piotrv1001~outschool-listings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-piotrv1001-outschool-listings-scraper",
                "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/piotrv1001~outschool-listings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-piotrv1001-outschool-listings-scraper",
                "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/piotrv1001~outschool-listings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-piotrv1001-outschool-listings-scraper",
                "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",
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword to search classes for (e.g. \"coding\", \"spanish\", \"chess\"). Leave empty to scrape the most popular classes across all subjects."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of classes to scrape.",
                        "default": 50
                    },
                    "scrapeDetails": {
                        "title": "Scrape full class details",
                        "type": "boolean",
                        "description": "Fetch the full detail page for each class (curriculum, learning goals, homework, policies, teacher credentials and more). This is slower and costs more.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings used while scraping.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
