# Coursera Courses, Ratings & Instructors Scraper (`scrapers_lat/coursera-scraper`) Actor

Scrape Coursera courses by keyword or URL. Extract title, partner, instructors, rating, reviews, enrollment, skills, price, level and certificate type. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/coursera-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Other
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.80 / 1,000 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?

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

[![Coursera Courses, Ratings & Instructors Scraper](https://scrapers.lat/banners/coursera-scraper.png)](https://console.apify.com/actors/xPMQyop1vZH7JqdxF/input)

## Coursera Courses, Ratings & Instructors Scraper

Here is one real result, with every field the actor returns (this record has `withDetails` and all three AI add-ons enabled; the long `subtitleLanguages` list and `description` are trimmed with a note, values real):

```json
{
  "imageUrl": "https://s3.amazonaws.com/coursera-course-photos/3c/77927732934dc0a10a44bd3306833d/1200x1200px_1001823008.jpg",
  "title": "Machine Learning with Python",
  "url": "https://www.coursera.org/learn/machine-learning-with-python",
  "id": "course~8UjeMk-mEeit4g4GsxE4dg",
  "productType": "COURSE",
  "partner": "IBM",
  "partners": ["IBM"],
  "partnerLogo": "http://coursera-university-assets.s3.amazonaws.com/bb/f5ced2bdd4437aa79f00eb1bf7fbf0/IBM-Logo-Blk---Square.png",
  "rating": 4.67,
  "reviewCount": 18448,
  "difficultyLevel": "Intermediate",
  "durationCategory": "1 to 3 months",
  "certificateType": "Course Certificate",
  "isFree": false,
  "isPartOfCourseraPlus": true,
  "isCreditEligible": false,
  "tagline": "Offered by IBM",
  "skills": ["Unsupervised Learning", "Supervised Learning", "Model Evaluation", "Regression Analysis", "Scikit Learn (Machine Learning Library)", "Machine Learning Methods", "Applied Machine Learning", "Model Training", "Predictive Modeling", "Machine Learning Algorithms", "Statistical Methods", "Machine Learning", "Dimensionality Reduction", "Python Programming", "Logistic Regression", "Model Optimization", "Classification Algorithms"],
  "tools": null,
  "languages": ["English"],
  "subtitleLanguages": ["Arabic", "Azerbaijani", "Bengali", "Chinese", "Dutch", "French", "German", "..."],
  "enrollmentCount": 703534,
  "instructors": ["Joseph Santarcangelo", "SAEED AGHABOZORGI"],
  "workload": "5-6 weeks of study, 3-6 hours per week",
  "description": "Python is a core skill in machine learning, and this course equips you with the tools to apply it effectively. You'll learn key ML concepts, build models with scikit-learn, and gain hands-on experience using Jupyter Notebooks. ...",
  "aiSummary": "This intermediate course on Machine Learning with Python, offered by IBM, teaches you essential machine learning concepts and techniques using Python and scikit-learn. It's designed for learners who want to deepen their understanding of both supervised and unsupervised learning methods, and by the end, you'll be able to build and evaluate machine learning models confidently, culminating in a final project on rainfall prediction.",
  "aiTags": ["machine learning", "python", "scikit learn", "supervised learning", "unsupervised learning", "model evaluation", "regression", "classification", "dimensionality reduction", "applied machine learning", "predictive modeling", "intermediate course"],
  "aiCategory": {
    "category": "Data Science",
    "subcategory": "Machine Learning",
    "level": "Intermediate"
  },
  "sourceQuery": "machine learning",
  "observedAt": "2026-08-14T07:06:50.486Z",
  "error": null
}
```

The most complete Coursera catalog scraper available. It returns every field the Coursera search exposes, including rating, review count, skills, partner, difficulty and pricing signals, plus detail-page enrichment (full description, instructors, workload, enrollment count) and three optional AI add-ons, and gives you three filters to target exactly the courses you need.

**📥 [Input](https://apify.com/scrapers_lat/coursera-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/coursera-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/coursera-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/coursera-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Full%20Catalog-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor searches the public Coursera catalog for each keyword or URL you pass, applies the filters you set, paginates through the matching products, and writes one normalized record per course to the run's dataset. Enum values are turned into readable labels, ratings are rounded, and when `withDetails` is on the actor opens each product to add the full description, instructor names, workload and total enrollment count. Missing source values are returned as `null`, never invented.

Data covers the entire public Coursera catalog: individual courses, specializations, professional certificates, guided projects and degrees. Three optional AI add-ons (`withAiSummary`, `withAiTags`, `withAiCategorize`) can enrich each record; they are opt-in, billed only when they produce output, and disabled on free Apify plans.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns 2 machine learning courses with detail pages.

```json
{
  "searchQueries": ["machine learning"],
  "maxCourses": 2,
  "withDetails": true
}
```

Instead of `searchQueries`, you can pass `startUrls` (course, specialization or search URLs). Leave the AI add-ons off (default) for the raw course fields.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQueries` | array | no\* | (empty) | One or more keywords to search, for example `machine learning`, `python`, `project management`. Each keyword runs its own search. |
| `startUrls` | array | no\* | (empty) | Coursera course, specialization or search URLs. Product URLs return that single product; search URLs run the keyword behind them. |
| `maxCourses` | integer | no | `10` | Maximum courses to collect across the run. Free Apify plans are capped at 25 per run. |
| `withDetails` | boolean | no | `true` | Open each product to add the full description, instructors, workload and enrollment count. |
| `productType` | enum | no | (all) | Restrict to one type: `Courses`, `Specializations`, `Professional Certificates`, `Guided Projects`, `Degrees`. Applies to keyword searches. |
| `difficultyLevel` | enum | no | (all) | Restrict to one level: `Beginner`, `Intermediate`, `Advanced`, `Mixed`. |
| `language` | enum | no | (all) | Only courses available in this language (audio or subtitles), for example `English`, `Spanish`, `Portuguese`. |
| `withAiSummary` | boolean | no | `false` | Add a plain-English AI summary of each course. Paid add-on, disabled on free plans. |
| `withAiTags` | boolean | no | `false` | Generate concise topic/keyword tags via AI. Paid add-on, disabled on free plans. |
| `withAiCategorize` | boolean | no | `false` | Classify each course into a subject category, subcategory and level via AI. Paid add-on, disabled on free plans. |

\* Provide at least one `searchQueries` entry or one `startUrls` entry.

### Output reference

One dataset item per course. Types: `string`, `number`, `boolean`, `string[]`, `object`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `imageUrl` | string | Course cover image URL. |
| `title` | string | Course or program name. |
| `url` | string | Direct link to the Coursera product page. |
| `id` | string | Coursera product ID. |
| `productType` | string | `COURSE`, `SPECIALIZATION`, `PROFESSIONAL_CERTIFICATE`, `GUIDED_PROJECT` or `DEGREE`. |
| `partner` | string | Primary university or company offering the product. |
| `partners` | string\[] | Every institution credited on the product. |
| `partnerLogo` | string | Logo image of the primary partner. |
| `rating` | number | Average learner rating out of 5, or `null`. |
| `reviewCount` | number | Number of ratings behind the score, or `null`. |
| `difficultyLevel` | string | `Beginner`, `Intermediate`, `Advanced` or `Mixed`. |
| `durationCategory` | string | Expected time to complete, for example `1 to 3 months`. |
| `certificateType` | string | Credential the product awards. |
| `isFree` | boolean | Whether the course can be taken free, or `null`. |
| `isPartOfCourseraPlus` | boolean | Whether it is included in a Coursera Plus subscription. |
| `isCreditEligible` | boolean | Whether it can count toward academic credit. |
| `tagline` | string | Short marketing tagline. |
| `skills` | string\[] | Skills the course teaches, or `null`. |
| `tools` | string\[] | Named software or tools taught, or `null`. |
| `languages` | string\[] | Languages with full audio and subtitles. |
| `subtitleLanguages` | string\[] | Languages available as subtitles only. |
| `enrollmentCount` | number | Total learners enrolled. Present with `withDetails`. |
| `instructors` | string\[] | Instructor names. Present with `withDetails`. |
| `workload` | string | Recommended study time and length. Present with `withDetails`. |
| `description` | string | Full course description. Present with `withDetails`. |
| `aiSummary` | string | AI plain-English summary. Present only when `withAiSummary` is enabled. |
| `aiTags` | string\[] | AI topic tags. Present only when `withAiTags` is enabled. |
| `aiCategory` | object | AI `category`, `subcategory`, `level`. Present only when `withAiCategorize` is enabled. |
| `sourceQuery` | string | The keyword or URL that produced this record. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

### Example output record

Real record from a live run (input `{"searchQueries":["machine learning"],"maxCourses":2,"withDetails":true}`), with the long description trimmed for readability:

```json
{
  "title": "Machine Learning with Python",
  "url": "https://www.coursera.org/learn/machine-learning-with-python",
  "id": "course~8UjeMk-mEeit4g4GsxE4dg",
  "productType": "COURSE",
  "partner": "IBM",
  "rating": 4.67,
  "reviewCount": 18448,
  "difficultyLevel": "Intermediate",
  "durationCategory": "1 to 3 months",
  "certificateType": "Course Certificate",
  "isFree": false,
  "isPartOfCourseraPlus": true,
  "tagline": "Offered by IBM",
  "languages": ["English"],
  "enrollmentCount": 703534,
  "instructors": ["Joseph Santarcangelo", "SAEED AGHABOZORGI"],
  "workload": "5-6 weeks of study, 3-6 hours per week",
  "description": "Python is a core skill in machine learning, and this course equips you with the tools to apply it effectively. ...",
  "sourceQuery": "machine learning",
  "observedAt": "2026-08-14T07:06:50.486Z",
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~coursera-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["machine learning"],"maxCourses":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~coursera-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["python"],"productType":"Professional Certificates","difficultyLevel":"Beginner","maxCourses":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/coursera-scraper \
  --input '{"startUrls":["https://www.coursera.org/learn/machine-learning-with-python"]}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per course returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/coursera-scraper/pricing) for the current per-result price.
- **Detail enrichment billed separately.** With `withDetails` on, a `details` event is charged per course only when the detail fetch succeeds.
- **AI add-ons billed separately.** `withAiSummary`, `withAiTags` and `withAiCategorize` each charge their own event only when they produce output, and are disabled on free plans.
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 25 records per run. Upgrade for higher `maxCourses`.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
The keyword matched nothing under the chosen filters. Loosen `productType`, `difficultyLevel` or `language`, or broaden the keyword. Zero-result runs are not charged.

**Can I scrape a specific course instead of searching?**
Yes. Paste one or more course, specialization or search URLs into `startUrls`. Product URLs return that single product; a search URL runs the keyword behind it.

**Where do enrollment numbers and instructor names come from?**
`enrollmentCount`, `instructors`, `description` and `workload` are collected when `withDetails` is enabled. The listing fields like `rating`, `skills` and pricing signals are always included.

**Why is a field like `workload` or `rating` null?**
Some products do not expose every field (for example workload on a specialization, or a rating on a brand new course). Missing source values are returned as `null`, never guessed.

**Do the AI add-ons work on a free plan?**
No. The AI add-ons require a paid Apify plan and are disabled automatically for free users. The base course fields are always returned.

**Is this an official Coursera tool?**
No. This actor is independent and has no affiliation with Coursera. It reads only data that is publicly available on the platform. Use it in accordance with Coursera's terms of service.

### Related scrapers

- [Chrome Web Store Extensions Scraper](https://apify.com/scrapers_lat/chrome-web-store-scraper): extensions, ratings, users and publisher data from the Chrome Web Store.
- [arXiv Research Papers & Abstracts Scraper](https://apify.com/scrapers_lat/arxiv-papers-scraper): titles, authors and abstracts from the arXiv research archive.
- [Apple App Store Reviews & Ratings Scraper](https://apify.com/scrapers_lat/app-store-reviews-scraper): user reviews, ratings and versions from the Apple App Store.
- [Clinical Trials Scraper](https://apify.com/scrapers_lat/clinicaltrials-scraper): studies, sponsors and conditions from the public clinical trials registry.
- [US Patents Scraper](https://apify.com/scrapers_lat/patents-uspto-scraper): patents with assignee, inventor and claims data.
- [Amazon Product Price & Reviews Scraper](https://apify.com/scrapers_lat/amazon-product-scraper): product prices, ratings and reviews from Amazon.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with Coursera. Accesses only publicly available course data. Use in accordance with Coursera's terms of service.

# Actor input Schema

## `maxCourses` (type: `integer`):

Maximum number of courses to collect across the whole run. Optional.

## `withDetails` (type: `boolean`):

When enabled, fetch each course's detail data to add the full description, instructor names, workload and total enrollment count. Adds a request per course.

## `searchQueries` (type: `array`):

One or more keywords to search the Coursera catalog (e.g. "machine learning", "python", "project management"). Each keyword runs its own search.

## `startUrls` (type: `array`):

Coursera course, specialization or search URLs (e.g. https://www.coursera.org/learn/machine-learning or https://www.coursera.org/search?query=data%20science). Course and specialization URLs return that single product; search URLs run the keyword.

## `withAiSummary` (type: `boolean`):

Add a plain-English AI summary of each course (what it covers, who it's for, outcomes). Opt-in, billed per enriched record; requires a paid Apify plan.

## `withAiTags` (type: `boolean`):

Generate concise topic/keyword tags for each course via AI. Opt-in, billed per enriched record.

## `withAiCategorize` (type: `boolean`):

Classify each course into a subject category, subcategory and level via AI. Opt-in, billed per enriched record.

## `productType` (type: `string`):

Restrict results to a single Coursera product type. Leave empty for all types.

## `difficultyLevel` (type: `string`):

Only return courses at this difficulty level. Leave empty for all levels.

## `language` (type: `string`):

Only return courses available in this language (as full audio or subtitles). Leave empty for all languages.

## Actor input object example

```json
{
  "maxCourses": 10,
  "withDetails": true,
  "searchQueries": [
    "machine learning"
  ],
  "withAiSummary": false,
  "withAiTags": false,
  "withAiCategorize": false,
  "productType": "",
  "difficultyLevel": "",
  "language": ""
}
```

# 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 = {
    "maxCourses": 10,
    "searchQueries": [
        "machine learning"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/coursera-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 = {
    "maxCourses": 10,
    "searchQueries": ["machine learning"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/coursera-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 '{
  "maxCourses": 10,
  "searchQueries": [
    "machine learning"
  ]
}' |
apify call scrapers_lat/coursera-scraper --silent --output-dataset

```

## MCP server setup

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