# Course Report Scraper (`crawlerbros/coursereport-scraper`) Actor

Scrape Course Report (coursereport.com) - coding bootcamp schools, subjects, courses, and verified alumni reviews. Browse all schools or by technology, pull full school profiles (ratings, tuition, locations, career tracks), course catalogs, and review text with sub-ratings.

- **URL**: https://apify.com/crawlerbros/coursereport-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Jobs, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Course Report Scraper

Scrape [Course Report](https://www.coursereport.com) — the largest directory of coding bootcamps and tech upskilling schools. Browse all 850+ schools or filter by technology/subject, pull full school profiles (rating breakdown, tuition range, locations, career tracks, job guarantees), course catalogs with pricing, and verified alumni reviews with sub-ratings. HTTP-only against the public site. No auth, no login, no proxy required.

### What this actor does

- **Five modes:** `schools`, `bySubject`, `schoolDetails`, `courses`, `reviews`
- **850+ bootcamp schools** across coding, data science, UX design, cybersecurity, product management, digital marketing, and more
- **117 subject/technology filters** (Python, JavaScript, Data Science, AI, Cybersecurity, etc.) for `bySubject` browsing
- **Full school profiles** — average rating, star-rating breakdown, review count, course count, tuition range, locations, career tracks, and job-guarantee/financing/GI-Bill flags
- **Course catalog** per school — course name, duration, price
- **Alumni reviews** — reviewer name, verification badge (LinkedIn/GitHub), job title, course taken, graduation year, review title/text, and per-category ratings (curriculum, job support, instructors)
- **Filters** — minimum school rating, minimum review rating, verified-only reviews, graduation-year range
- **Empty fields are omitted**

### Output per record

#### `school` (mode=schools / bySubject)

- `schoolName`, `schoolSlug`, `sourceUrl`
- `rating`, `reviewCount`, `courseCount`
- `logoUrl`
- `subjectSlug` (when browsing by subject)
- `recordType: "school"`, `scrapedAt`

#### `schoolDetail` (mode=schoolDetails)

- `schoolName`, `schoolSlug`, `sourceUrl`, `description`
- `rating`, `reviewCount`, `courseCount`
- `ratingBreakdown` — count of `5Star`…`1Star` reviews
- `locations[]`, `careerTracks[]`
- `priceRangeLow`, `priceRangeHigh`
- `logoUrl`, `email`
- `guaranteesJob`, `offersJobAssistance`, `includesHousing`, `offersCorporateTraining`, `acceptsGiBill` (booleans)
- `recordType: "schoolDetail"`, `scrapedAt`

#### `course` (mode=courses)

- `courseName`, `courseSlug`, `sourceUrl`
- `schoolSlug`, `schoolName`
- `durationWeeks`, `price`
- `recordType: "course"`, `scrapedAt`

#### `review` (mode=reviews)

- `reviewerName`, `verificationType` (e.g. `Verified via LinkedIn`, `Unverified`)
- `reviewerStatus` (job title or `Graduate`/`Student`)
- `courseName`, `graduationYear`
- `reviewTitle`, `reviewText`
- `overallRating`, `curriculumRating`, `jobSupportRating`, `instructorsRating`
- `schoolSlug`, `schoolName`, `sourceUrl`
- `recordType: "review"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `schools` | `schools` / `bySubject` / `schoolDetails` / `courses` / `reviews` |
| `subjectSlug` | select | – | Subject to browse (mode=bySubject) |
| `schoolSlugs` | array | `["general-assembly"]` | School slugs or URLs (modes=schoolDetails, courses, reviews) |
| `minSchoolRating` | number | – | Drop schools rated below this (0.0–5.0) |
| `minReviewRating` | number | – | Drop reviews rated below this (0.0–5.0) |
| `verifiedReviewsOnly` | bool | `false` | Only emit LinkedIn/GitHub-verified reviews |
| `graduationYearMin` | int | – | Drop reviews from before this graduation year |
| `graduationYearMax` | int | – | Drop reviews from after this graduation year |
| `maxItems` | int | `25` | Hard cap on emitted records (1–2000) |

#### Example: browse all schools, 4.5+ rated

```json
{
  "mode": "schools",
  "minSchoolRating": 4.5,
  "maxItems": 50
}
```

#### Example: browse schools teaching Python

```json
{
  "mode": "bySubject",
  "subjectSlug": "python-courses",
  "maxItems": 50
}
```

#### Example: full profile for specific schools

```json
{
  "mode": "schoolDetails",
  "schoolSlugs": ["general-assembly", "brainstation", "le-wagon"]
}
```

#### Example: verified 5-star reviews only

```json
{
  "mode": "reviews",
  "schoolSlugs": ["general-assembly"],
  "verifiedReviewsOnly": true,
  "minReviewRating": 5,
  "maxItems": 100
}
```

### Use cases

- **Bootcamp comparison sites** — aggregate ratings, tuition, and locations across schools
- **Lead generation** — find schools offering job guarantees or GI Bill acceptance
- **Market research** — track course pricing and duration trends by subject
- **Reputation monitoring** — pull fresh alumni reviews for a specific school
- **Career counseling tools** — surface career-track and location coverage per school
- **Content/SEO** — build "best bootcamps for X" comparison pages from real review data

### FAQ

**What's Course Report?** The largest independent directory of coding bootcamps, with 850+ schools and tens of thousands of verified alumni reviews. See [coursereport.com](https://www.coursereport.com).

**How are reviews "verified"?** Course Report verifies reviewers via LinkedIn or GitHub sign-in; the actor surfaces this as `verificationType`. Unverified/anonymous reviews are also included unless `verifiedReviewsOnly` is set.

**Why do some schools have duplicate subject slugs (e.g. Blockchain)?** Course Report maintains two overlapping subject taxonomies for some topics; both are exposed as separate `subjectSlug` options so you can pick either listing.

**Does this require login or an API key?** No — everything is scraped from Course Report's public pages.

**How fresh is the data?** Live — every run re-fetches the current page HTML from coursereport.com.

**What does `ratingBreakdown` mean?** The count of reviews at each star level (5 down to 1) shown on the school's profile page, e.g. `{"5Star": 466, "4Star": 133, ...}`.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `subjectSlug` (type: `string`):

Bootcamp subject/technology to browse schools by.

## `schoolSlugs` (type: `array`):

Course Report school slugs (e.g. `general-assembly`) or full school URLs (e.g. `https://www.coursereport.com/schools/general-assembly`).

## `minSchoolRating` (type: `number`):

Drop schools with an average alumni rating below this (0.0–5.0 — e.g. 4 or 4.5).

## `minReviewRating` (type: `number`):

Drop reviews with an overall rating below this (0.0–5.0).

## `verifiedReviewsOnly` (type: `boolean`):

Only emit reviews verified via LinkedIn/GitHub; drop unverified/anonymous reviews.

## `graduationYearMin` (type: `integer`):

Drop reviews from alumni who graduated before this year.

## `graduationYearMax` (type: `integer`):

Drop reviews from alumni who graduated after this year.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "schools",
  "schoolSlugs": [
    "general-assembly"
  ],
  "verifiedReviewsOnly": false,
  "maxItems": 25
}
```

# Actor output Schema

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

Dataset containing all scraped schools, courses, and reviews.

# 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 = {
    "mode": "schools",
    "schoolSlugs": [
        "general-assembly"
    ],
    "verifiedReviewsOnly": false,
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/coursereport-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 = {
    "mode": "schools",
    "schoolSlugs": ["general-assembly"],
    "verifiedReviewsOnly": False,
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/coursereport-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "schools",
  "schoolSlugs": [
    "general-assembly"
  ],
  "verifiedReviewsOnly": false,
  "maxItems": 25
}' |
apify call crawlerbros/coursereport-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/coursereport-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ePsU3UhMh7gV6Qccv/builds/U6MgZhgWwVnhuoQ1U/openapi.json
