# Coursera Course Scraper (`harpoon/coursera-course-scraper`) Actor

Extract complete Coursera course details from any course URL - description, instructors, ratings, reviews, and the full module-by-module syllabus.

- **URL**: https://apify.com/harpoon/coursera-course-scraper.md
- **Developed by:** [Harpoon](https://apify.com/harpoon) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 course results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Coursera Course Scraper — turn any Coursera course URL into a complete, structured record

Paste one or more Coursera course URLs and get back everything the course page shows: the full
description, level, workload and duration, instructors, partner university or company, skills,
subject areas, ratings and review counts, the star breakdown, learner reviews, FAQs, and the
complete module-by-module syllabus. Each URL produces exactly one clean row in the dataset —
ready to export to JSON, CSV, Excel, or XML, or pull straight into your own app.

#### What can Coursera Course Scraper do?

- Extract a complete course profile from a single course URL
- Capture the **full syllabus** — every module with its lectures, assessments, and supplements
- Collect **instructors**, **partners**, **skills**, and **subject domains**
- Include **ratings**, the five-star breakdown, review counts, and the **top learner reviews**
- List the **programs** the course belongs to and the **related courses** shown alongside it
- De-duplicate URLs and scrape several courses in parallel
- Export results to JSON, CSV, Excel, or XML
- Run via the API, schedule runs, and integrate through webhooks or MCP

### What data can I extract?

<table>
<tr><th>What you get</th><th>Features</th></tr>
<tr><td>

- **Course** — id, slug, url, name, full description, type, status, difficulty level, estimated workload, total duration, lecture duration, certificate types, languages (primary, subtitle, translated, dubbed)
- **Instructors** — name, title, department, courses taught, learners reached, photo, website
- **Partners** — university/company name, short name, description, website, logos
- **Subjects & skills** — domains and subdomains, skill tags with a tool/software flag, learning objectives, recommended background
- **Ratings & reviews** — average rating, rating count, review count, five-to-one-star breakdown, content-satisfaction score, instructor rating, top reviews
- **Syllabus** — modules with lectures, assessments, and supplements, each with id, name, slug, type, and duration
- **Programs** — the wrapping specialization/professional certificate and its course count
- **Related courses** — names, slugs, and URLs of nearby courses
- **Media** — course image and thumbnail URLs

</td><td>

- One row per course URL — no pagination, no filters to configure
- Everything on by default; toggle the heavy sections off to shrink rows
- Cap the related-courses list per row
- Export to JSON, CSV, Excel, XML
- Dataset views: **Overview** and **Engagement**
- API access, webhooks, SDKs
- LLM-ready output for MCP, ChatGPT, Claude

</td></tr>
</table>

### How to use Coursera Course Scraper

1. [Create](https://console.apify.com/sign-up) a free Apify account.
2. Open **Coursera Course Scraper** in Apify Console.
3. Paste one or more course URLs into **Course URLs** — the field is prefilled with a working example.
4. Optionally turn off the **Full syllabus**, **Top reviews**, or **Related courses** sections, or lower **Max related courses**.
5. Click **Save & Start**.
6. Open the **Storage** tab and download the dataset as JSON, CSV, Excel, or XML.

### Input

There is one way to run it: **course URLs**. Each URL yields exactly one row, so the form needs
nothing else to run. The detail toggles only control how much each row contains.

- `targets` — the Coursera course URLs (or bare course slugs), one per line. Duplicates are removed.
- `include_syllabus` — keep the module-by-module syllabus (on by default).
- `include_reviews` — keep the learner reviews (on by default).
- `include_related_courses` — keep the related-courses list (on by default).
- `max_related_courses` — how many related courses to keep per row (default 12).

**Example input**

```json
{
  "targets": [
    "https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep"
  ],
  "include_syllabus": true,
  "include_reviews": true,
  "include_related_courses": true,
  "max_related_courses": 12
}
```

See the **Input** tab above for every parameter.

### Output

Results land in the default dataset under the **Storage** tab. View them as a table (use the
**Overview** or **Engagement** view), or download as JSON, CSV, Excel, or XML.

Real, trimmed output for one course (arrays shortened and some long text fields omitted for
readability):

```json
{
  "id": "05KvWJnaEe6ZVg6lscp7ZQ",
  "slug": "cybersecurity-job-search-resume-and-interview-prep",
  "url": "https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep",
  "name": "Cybersecurity Job Search, Resume, and Interview Prep",
  "course_type": "STANDARD_COURSE",
  "course_status": "LAUNCHED",
  "difficulty_level": "BEGINNER",
  "estimated_workload": "4 weeks of study, 2-3 hours/week",
  "duration": "PT10H53M35S",
  "total_lecture_duration": "PT3H18M35S",
  "certificate_types": ["SPECIALIZATION", "VERIFIED_CERTIFICATE"],
  "primary_languages": ["en"],
  "enrollment_count": 11052,
  "page_views_last_month": 23560,
  "launched_at": "2024-04-10T00:25:14.6Z",
  "rating": 4.844444444444444,
  "rating_count": 135,
  "review_count": 33,
  "rating_breakdown": {
    "five_star": 122,
    "four_star": 11,
    "three_star": 3,
    "two_star": 0,
    "one_star": 1
  },
  "content_satisfaction_score": 95.22184300341297,
  "content_satisfaction_ratings_count": 1758,
  "average_instructor_rating": 4.62,
  "instructor_rating_count": 27,
  "instructors": [
    {
      "id": "101259896",
      "name": "IBM Skills Network Team",
      "short_name": "ibm-skills-network",
      "courses_taught": 99,
      "learners_reached": 3086621,
      "photo_url": "https://d3njjcbhbojbot.cloudfront.net/api/utilities/v1/imageproxy/https://coursera-instructor-photos.s3.amazonaws.com/37/77670911ef45c38688f2987b943f78/SN_200x200_V3.jpg"
    }
  ],
  "partners": [
    {
      "id": "348",
      "name": "IBM",
      "short_name": "ibm-skills-network",
      "website": "http://ibm.com/training",
      "logo_url": "https://d3njjcbhbojbot.cloudfront.net/api/utilities/v1/imageproxy/http://coursera-university-assets.s3.amazonaws.com/54/a2cad57ff54d7ca2b771edc7572b46/IBM-Logo-Blk.png",
      "square_logo_url": "http://coursera-university-assets.s3.amazonaws.com/bb/f5ced2bdd4437aa79f00eb1bf7fbf0/IBM-Logo-Blk---Square.png"
    }
  ],
  "domains": [
    {
      "domain_id": "information-technology",
      "domain_name": "Information Technology",
      "subdomain_id": "security",
      "subdomain_name": "Security"
    }
  ],
  "skills": [
    { "id": "writing", "name": "Writing", "is_tool_software": false },
    { "id": "presentations", "name": "Presentations", "is_tool_software": false },
    { "id": "job-analysis", "name": "Job Analysis", "is_tool_software": false }
  ],
  "learning_objectives": [
    "Explain cybersecurity roles, titles, responsibilities, and required skills and competencies, and explore the NICE framework",
    "Create a resume, portfolio, elevator pitch, and cover letter and apply best practices to prepare for a cybersecurity job interview"
  ],
  "primary_specialization": {
    "id": "child~lT6-h5CdRjm1hGmNxH5tOw",
    "name": "IBM Cybersecurity Analyst",
    "slug": "ibm-cybersecurity-analyst",
    "product_variant": "PROFESSIONAL_CERTIFICATE",
    "headline": "Launch your career as a cybersecurity professional",
    "subheader": "Build job-ready skills and prep for the CompTIA Security+ exam with this program. ",
    "course_count": 14
  },
  "syllabus": [
    {
      "id": "Xi6px",
      "name": "Getting Ready for a Cybersecurity Career",
      "total_duration": "PT3H29M38S",
      "total_lecture_duration": "PT1H4M38S",
      "lectures": [
        {
          "id": "af836",
          "name": "Course Introduction",
          "slug": "course-introduction",
          "type": "LECTURE",
          "duration": "PT3M38S",
          "contains_ai_grading": false
        }
      ],
      "assessments": [
        {
          "id": "X2uMj",
          "name": "Lesson 1 Practice Quiz: Cybersecurity as a Career",
          "slug": "lesson-1-practice-quiz-cybersecurity-as-a-career",
          "type": "ASSIGNMENT",
          "duration": "PT10M",
          "contains_ai_grading": false
        }
      ],
      "supplements": [
        {
          "id": "kpS3m",
          "name": "Prerequisites and Course Syllabus",
          "slug": "prerequisites-and-course-syllabus",
          "type": "SUPPLEMENT",
          "duration": "PT2M",
          "contains_ai_grading": false
        }
      ]
    }
  ],
  "faqs": [
    {
      "question": "When will I have access to the lectures and assignments?",
      "answer": "To access course materials, assignments, and earn a Certificate, you'll need to purchase the Certificate experience when you enroll in a course."
    }
  ],
  "reviews": [
    {
      "id": "25637895~COURSE!~05KvWJnaEe6ZVg6lscp7ZQ",
      "author_name": "CC",
      "rating": 5,
      "comment": "This was so filled with awesome-ness!! Happy I stuck with it! You will be too;-)",
      "created_at": "2025-09-22T00:00:00Z"
    }
  ],
  "related_courses": [
    {
      "id": "YlfzdXJKEeyKjA79ESMRTQ",
      "name": "Introduction to Cybersecurity Essentials",
      "slug": "introduction-to-cybersecurity-essentials",
      "url": "https://www.coursera.org/learn/introduction-to-cybersecurity-essentials",
      "product_type": "COURSE"
    },
    {
      "id": "0FMl8S8GEemvsQrYkluC5g",
      "name": "Introduction to Cybersecurity Tools & Cyberattacks",
      "slug": "introduction-cybersecurity-cyber-attacks",
      "url": "https://www.coursera.org/learn/introduction-cybersecurity-cyber-attacks",
      "product_type": "COURSE"
    }
  ],
  "image_url": "https://s3.amazonaws.com/coursera-course-photos/d5/c1028bad674b91a4f4cac6b63340cf/200700-Cybersecurity-Careers-Logo-Image.png",
  "thumbnail_url": "https://s3.amazonaws.com/coursera_assets/meta_images/generated/XDP/XDP~COURSE!~cybersecurity-job-search-resume-and-interview-prep/XDP~COURSE!~cybersecurity-job-search-resume-and-interview-prep.jpeg"
}
```

Field names are lowercase snake\_case, and the input keys match them.

### What can you do with the data?

Each recipe names the exact input and fields to use.

#### 1. Shortlist courses for a curriculum

1. Add the course URLs you are considering to `targets`.
2. Run with the defaults and open the **Engagement** dataset view.
3. Compare `rating`, `rating_count`, `enrollment_count`, and `content_satisfaction_score`, then export the shortlist to CSV.

#### 2. Rebuild a course outline in your own LMS

1. Add the course URL to `targets` and keep **Full syllabus** on.
2. Read `syllabus` — each module has `lectures`, `assessments`, and `supplements` with `name`, `type`, and `duration`.
3. Map the modules into your LMS structure, using `total_lecture_duration` for time estimates.

#### 3. Build a searchable training catalog

1. Paste your catalog's course URLs into `targets`.
2. Use `skills`, `domains`, `partners`, and `difficulty_level` as facets.
3. Feed the JSON into your search index or recommendation engine with `skills[].name` and `related_courses`.

### How much does Coursera Course Scraper cost?

There is **no per-course fee** — runs are billed as standard **Apify platform usage** based on
the compute they consume. Fetching one course is a single lightweight request, so a run of a
few hundred course URLs typically finishes in under a minute on the default 1 GB memory and
uses only a fraction of a compute unit.

> TODO: confirm the exact platform-usage rate and any pay-per-result pricing on the **Pricing** tab before publishing.

See the **Pricing** tab for current rates and plan discounts.

### FAQ

**Do I need an account, cookies, or an API key?**
No Coursera account, cookies, or keys are needed — only a free Apify account. Public course data only.

**Can I scrape private, paid, or restricted content?**
No. The Actor returns the public information shown on a course page; it does not access paid materials, videos, quizzes, or anything behind a login.

**How many courses can I get?**
One row per course URL. There is no fixed cap — add as many URLs as you like. Courses are fetched several at a time, so very large lists simply take longer.

**Why did one of my URLs return nothing?**
A URL must point at a single course (for example `coursera.org/learn/<slug>`). Pages for specializations, professional certificates, or degrees are not single courses and will be skipped with a message in the run log. Removed or renamed courses are skipped too — one bad URL never stops the rest of the run.

**Are the reviews complete?**
No. `reviews` contains the reviews shown on the course page, not every review ever left.

**What do `duration` and `total_lecture_duration` mean?**
They are ISO 8601 duration strings, e.g. `PT10H53M35S` is 10 hours, 53 minutes, 35 seconds.

**Is it legal to scrape Coursera?**
The Actor reads publicly available course pages. You are responsible for how you use the data and for complying with Coursera's terms and applicable laws. See Apify's guidance on legal and ethical scraping.

**Can I use it with the API / SDKs / MCP?**
Yes — see the **API** tab above, or connect through the Apify MCP server. Field names and input keys are lowercase snake\_case, so they map cleanly into LLM and agent workflows.

**Something isn't working.**
Open an issue in the **Issues** tab with the course URL and a copy of the run log. Individual failures are logged and skipped, so a partial dataset usually means one or more URLs were invalid or unavailable.

### Notes and limitations

- **One course per URL.** Specialization, professional-certificate, and degree pages are not single courses and are not supported — use the URLs of the individual courses inside them.
- **Reviews are a subset.** Only the reviews displayed on the course page are returned.
- **Related courses are capped** by `max_related_courses` (default 12).
- **Durations are ISO 8601 strings**, not seconds.
- **Counts are point-in-time.** `rating`, `rating_count`, `enrollment_count`, and `page_views_last_month` change over time.
- **Some fields can be empty** when the course has none — for example `dubbed_languages`, `recommended_background`, or `reviews`.

### Run locally

```
go run ./cmd/actor
```

Input is read from the Apify key-value store; see `INPUT_SCHEMA.json`.

### Support

Found a bug or have feedback? Open an issue in the **Issues** tab of the Actor.

# Actor input Schema

## `targets` (type: `array`):

<b>One course URL per line</b>, e.g. <code>https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep</code>. Bare course slugs (e.g. <code>machine-learning</code>) also work. Duplicates are removed automatically.

## `include_syllabus` (type: `boolean`):

<b>Include the module-by-module breakdown</b> - every module with its lectures, assessments, and supplements. Turn it off to keep rows small.

## `include_reviews` (type: `boolean`):

Include the learner reviews shown on the course page, with author, rating, comment, and date.

## `include_related_courses` (type: `boolean`):

Include the related courses listed alongside the course, with their names and URLs.

## `max_related_courses` (type: `integer`):

How many related courses to keep per course when <b>Related courses</b> is on. Higher values only affect the size of the result, not the run time.

## Actor input object example

```json
{
  "targets": [
    "https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep",
    "https://www.coursera.org/learn/machine-learning"
  ],
  "include_syllabus": true,
  "include_reviews": true,
  "include_related_courses": true,
  "max_related_courses": 12
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per course, with instructors, partners, ratings, reviews, and the full syllabus. Export as JSON, CSV, Excel, or XML.

# 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 = {
    "targets": [
        "https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep"
    ],
    "include_syllabus": true,
    "include_reviews": true,
    "include_related_courses": true,
    "max_related_courses": 12
};

// Run the Actor and wait for it to finish
const run = await client.actor("harpoon/coursera-course-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 = {
    "targets": ["https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep"],
    "include_syllabus": True,
    "include_reviews": True,
    "include_related_courses": True,
    "max_related_courses": 12,
}

# Run the Actor and wait for it to finish
run = client.actor("harpoon/coursera-course-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 '{
  "targets": [
    "https://www.coursera.org/learn/cybersecurity-job-search-resume-and-interview-prep"
  ],
  "include_syllabus": true,
  "include_reviews": true,
  "include_related_courses": true,
  "max_related_courses": 12
}' |
apify call harpoon/coursera-course-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,harpoon/coursera-course-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/zYUtXLcGc16yAGN4T/builds/azp8gw7veV6ZnJ7q7/openapi.json
