# Coursera Scraper (`parsebird/coursera-scraper`) Actor

Scrape Coursera search results: courses, Specializations, Professional Certificates, projects, and degrees with ratings, reviews, skills, providers, level, duration, languages, and free/Coursera Plus flags. Filter like the site. Export JSON, CSV, Excel.

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

## Pricing

from $0.69 / 1,000 courses

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 Scraper

Coursera Scraper extracts search results from [Coursera](https://www.coursera.org): courses, Specializations, Professional Certificates, Guided Projects, and degrees, with ratings, review counts, skills, providers, level, duration, languages, and free or Coursera Plus status.

<table><tr>
<td style="border-left:4px solid #0056D2;padding:12px 16px;font-weight:600">
Search Coursera by keyword or paste a search URL, filter by product type, level, duration, subject, language, educator, skill, free, or Coursera Plus, and get up to 10,000 results per search with 45+ fields each.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use Apify Actor parsebird/coursera-scraper to scrape Coursera search results (courses, Specializations, Professional Certificates, projects, degrees). Example with ApifyClient (Python): client.actor("parsebird/coursera-scraper").call(run_input={"queries":["machine learning"],"productTypes":["Professional Certificates"],"levels":["Beginner"],"maxResults":200}). Inputs: queries array of strings (search terms, each searched separately); startUrls array of strings (coursera.org/search URLs; their query, filters, and sortBy are used); productTypes array (Courses, Specializations, Professional Certificates, Guided Projects, Projects, Degrees, Graduate Certificates, University Certificates, Postgraduate Diploma, MasterTrack® Certificates); levels array (Beginner, Intermediate, Advanced, Mixed); durations array (Less Than 2 Hours, 1-4 Weeks, 1-3 Months, 3-6 Months, 6-12 Months, 1-4 Years); topics array (Arts and Humanities, Business, Computer Science, Data Science, Health, Information Technology, Language Learning, Math and Logic, Personal Development, Physical Science and Engineering, Social Sciences); languages array of strings; partners array of strings (e.g. Google, IBM); skills array of strings; freeOnly boolean default false; courseraPlusOnly boolean default false; sortBy BEST_MATCH or NEW; maxResults integer default 100 (per search, max 10000); maxPages integer optional (100 results per page); deduplicate boolean default true (across searches); filters alone (no query) browse the whole catalog. Also accepts query, startUrl, results_wanted, max_pages. Output: one row per result: id, name, url, imageUrl, avgProductRating, numProductRatings, productDifficultyLevel, productDuration, productType, skills[], partners[], partnerLogos[], tagline, isCourseFree, isCreditEligible, isNewContent, isPartOfCourseraPlus, cobrandingEnabled, completions, duration, parentCourseName, parentLessonName, translatedName, translatedSkills, translatedParentCourseName, translatedParentLessonName, fullyTranslatedLanguages[], subtitlesOnlyLanguages[], videosInLesson, handsOnLearningTypes[], toolSoftwareSkillNames[], productCardId, canonicalType, marketingProductType, badges[], isPathwayContent, courseCardRating, courseCardReviewCount, searchQuery, searchRank, page, totalElements, totalPages, sourceIndexName, aiSearchSummaryEligible. API docs: https://docs.apify.com/api/client/python/ and https://docs.apify.com/api/client/js/. Token: https://console.apify.com/account/integrations.
```

### What is Coursera Scraper?

**Coursera Scraper** is a **Coursera course scraper** that collects the same results you see on the [Coursera search page](https://www.coursera.org/search), as structured data. For every **course**, **Specialization**, **Professional Certificate**, **Guided Project**, or **degree** it returns the **name**, **link**, **image**, **average rating**, **number of ratings**, **skills**, **educators** (universities and companies), **level**, **duration**, **languages**, **badges**, and whether it is **free** or part of **Coursera Plus**.

It works as a **Coursera API** alternative: you don't need a Coursera account, an API key, or a browser. The easiest way to try it is to open the actor, keep the prefilled search term `python`, and click **Start**. The prefilled run saves 20 results in a few seconds.

### What can Coursera Scraper do?

- 🔍 **Search Coursera by keyword**: add any number of search terms and each one is searched separately, in Coursera's own ranking order.
- 🔗 **Start from a Coursera search URL**: paste a URL from your browser and the actor uses its search term, filters, and sort order.
- 🎯 **Filter like the website**: product type, level, duration, subject, language, educator, and skill. Turn on **Free courses only** or **Coursera Plus only**.
- 📚 **Browse the catalog without a keyword**: set only filters, for example every Professional Certificate in Data Science.
- 🆕 **Sort by best match or newest** to track new launches.
- ♻️ **Skip duplicates** when several search terms find the same course.
- 📈 **Scale**: up to 10,000 results per search, the most Coursera shows for one search.
- ⏱️ **Automate** with [Apify schedules](https://docs.apify.com/platform/schedules), the [Apify API](https://docs.apify.com/api/v2), webhooks, and [integrations](https://apify.com/integrations) such as Google Sheets, Make, Zapier, and Slack.
- 📁 **Export** results as JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Coursera?

| Field | Description |
|-------|-------------|
| `name`, `url`, `imageUrl`, `tagline` | Title, link, image, and short description |
| `productType` | `COURSE`, `SPECIALIZATION`, `PROFESSIONAL_CERTIFICATE`, `GUIDED_PROJECT`, `PROJECT`, degrees, and more |
| `avgProductRating`, `numProductRatings` | Average star rating and number of ratings |
| `partners`, `partnerLogos` | Universities or companies offering it, with logos |
| `skills`, `toolSoftwareSkillNames` | Skills you gain and tools taught |
| `productDifficultyLevel`, `productDuration` | Level (`BEGINNER`, `INTERMEDIATE`, ...) and time to complete (`ONE_TO_THREE_MONTHS`, ...) |
| `isCourseFree`, `isPartOfCourseraPlus`, `isCreditEligible`, `isNewContent` | Free, Coursera Plus, credit-eligible, and new flags |
| `badges` | Labels shown on the card, such as `Free Trial` |
| `fullyTranslatedLanguages`, `subtitlesOnlyLanguages` | Languages the content is taught in, and subtitle-only languages |
| `handsOnLearningTypes` | Hands-on formats such as Coding Labs or Guided Projects |
| `courseCardRating`, `courseCardReviewCount`, `isPathwayContent` | Rating and reviews from the course card, and pathway membership |
| `searchQuery`, `searchRank`, `page`, `totalElements`, `totalPages` | Which search found it, its position, and how many results the search has |

### How to scrape Coursera

1. Open [Coursera Scraper](https://apify.com/parsebird/coursera-scraper) and click **Try for free** or **Start**.
2. Add search terms in **Search terms**, or paste Coursera search URLs in **Coursera search URLs**.
3. Optionally pick filters: **Learning product**, **Level**, **Duration**, **Subject**, **Language**, **Educator**, **Skills**, **Free courses only**, or **Coursera Plus only**.
4. Set **Max results per search**.
5. Click **Start**, then open the **Output** tab or export the results as JSON, CSV, or Excel.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `queries` | array of strings | No\* | — | Search terms, each searched separately. Prefilled with `python` |
| `startUrls` | array of strings | No\* | — | Coursera search URLs; their query, filters, and sort order are used |
| `productTypes` | array | No | — | Courses, Specializations, Professional Certificates, Guided Projects, Projects, Degrees, and more |
| `levels` | array | No | — | Beginner, Intermediate, Advanced, Mixed |
| `durations` | array | No | — | Less Than 2 Hours, 1-4 Weeks, 1-3 Months, 3-6 Months, 6-12 Months, 1-4 Years |
| `topics` | array | No | — | Subjects such as Business, Computer Science, Data Science, Health |
| `languages` | array of strings | No | — | Languages, e.g. English, Spanish |
| `partners` | array of strings | No | — | Educators, e.g. Google, IBM, University of Michigan |
| `skills` | array of strings | No | — | Skills, e.g. Python Programming |
| `freeOnly` | boolean | No | `false` | Only results Coursera lists as free |
| `courseraPlusOnly` | boolean | No | `false` | Only results included in Coursera Plus |
| `sortBy` | string | No | best match | `BEST_MATCH` or `NEW` |
| `maxResults` | integer | No | `100` | Results per search (max 10,000). Prefilled with 20 |
| `maxPages` | integer | No | — | Optional cap on 100-result pages per search |
| `deduplicate` | boolean | No | `true` | Save each course once across all searches |
| `proxyConfiguration` | object | No | — | Optional. Not needed; Apify Proxy is used automatically if Coursera limits requests |

\* Give at least one search term, search URL, or filter. With filters only, the actor browses the whole Coursera catalog. The actor also accepts `query`, `startUrl`, `results_wanted`, and `max_pages`, so inputs written for other Coursera scrapers work unchanged.

### Input / Output

**Example input: beginner Professional Certificates and Specializations from Google and IBM**

```json
{
    "queries": ["data science"],
    "productTypes": ["Professional Certificates", "Specializations"],
    "levels": ["Beginner"],
    "partners": ["Google", "IBM"],
    "maxResults": 200
}
```

**Example input: from a Coursera search URL**

```json
{
    "startUrls": ["https://www.coursera.org/search?query=data%20analytics&productDifficultyLevel=Beginner&sortBy=NEW"],
    "maxResults": 50
}
```

**Example input: every free course about Excel**

```json
{
    "queries": ["excel"],
    "freeOnly": true,
    "maxResults": 500
}
```

**Example output** (a real row; `subtitlesOnlyLanguages` shortened)

```json
{
  "id": "course~ejOz7RDUEei99hK0xs-tsg",
  "name": "Python for Data Science, AI & Development",
  "url": "https://www.coursera.org/learn/python-for-applied-data-science-ai",
  "imageUrl": "https://s3.amazonaws.com/coursera-course-photos/b7/7cc18d8ade45138182ed8832a41860/V1_arc_scatter_PythonforDataScience-AI-Development_IBM.webp",
  "avgProductRating": 4.62,
  "numProductRatings": 43831,
  "productDifficultyLevel": "BEGINNER",
  "productDuration": "ONE_TO_THREE_MONTHS",
  "productType": "COURSE",
  "skills": ["Data Import/Export", "Python Programming", "NumPy", "Scripting", "Data Collection", "Data Analysis"],
  "partners": ["IBM"],
  "partnerLogos": ["http://coursera-university-assets.s3.amazonaws.com/bb/f5ced2bdd4437aa79f00eb1bf7fbf0/IBM-Logo-Blk---Square.png"],
  "tagline": null,
  "isCourseFree": false,
  "isCreditEligible": false,
  "isNewContent": false,
  "isPartOfCourseraPlus": true,
  "cobrandingEnabled": null,
  "completions": null,
  "duration": null,
  "parentCourseName": null,
  "parentLessonName": null,
  "translatedName": null,
  "translatedSkills": null,
  "translatedParentCourseName": null,
  "translatedParentLessonName": null,
  "fullyTranslatedLanguages": ["English"],
  "subtitlesOnlyLanguages": ["Arabic", "Azerbaijani", "Bengali", "Chinese"],
  "videosInLesson": null,
  "handsOnLearningTypes": [],
  "toolSoftwareSkillNames": [],
  "productCardId": "ejOz7RDUEei99hK0xs-tsg",
  "canonicalType": "COURSE",
  "marketingProductType": "COURSE",
  "badges": ["Free Trial"],
  "isPathwayContent": false,
  "courseCardRating": 4.62,
  "courseCardReviewCount": 43831,
  "searchQuery": "python",
  "searchRank": 2,
  "page": 1,
  "totalElements": 2152,
  "totalPages": 22,
  "sourceIndexName": "consumer_products_cohere_embed_english_v3_synonyms_alias:rt-search-heavy-ranker-e12r-prod",
  "aiSearchSummaryEligible": true
}
```

Download results from the **Output** tab in JSON, CSV, Excel, HTML, or XML. The Console also has a **Skills & languages** table view.

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("parsebird/coursera-scraper").call(
    run_input={
        "queries": ["machine learning", "generative ai"],
        "productTypes": ["Professional Certificates"],
        "maxResults": 200,
    }
)

for course in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(course["name"], course["partners"], course["avgProductRating"], course["url"])
```

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const run = await client.actor('parsebird/coursera-scraper').call({
    queries: ['python'],
    freeOnly: true,
    maxResults: 300,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const topRated = items
    .filter((c) => (c.numProductRatings ?? 0) > 1000)
    .sort((a, b) => b.avgProductRating - a.avgProductRating);
console.log(topRated.slice(0, 10).map((c) => `${c.avgProductRating} ${c.name}`));
```

See the [Python client docs](https://docs.apify.com/api/client/python/) and [JavaScript client docs](https://docs.apify.com/api/client/js/) for more options.

### Use cases

- **Course comparison and recommendation sites**: keep a catalog of Coursera courses with ratings, skills, and providers.
- **EdTech and market research**: see which subjects, skills, and educators dominate a topic, and how many results each search has.
- **Competitive tracking for universities and training companies**: monitor which courses rank for your keywords and sort by **Newest** to catch launches.
- **L\&D and HR teams**: build curated learning paths for skills such as Python, SQL, or project management, filtered by level and duration.
- **SEO and content research**: track search rank (`searchRank`) of courses for target keywords over time with scheduled runs.

### How it works

1. The actor sends each search term or URL to Coursera's search, with your filters and sort order, the same way the Coursera website does.
2. It reads results in pages of 100 until it reaches **Max results per search**, **Max pages per search**, or the end of the results.
3. Each result becomes one row with an absolute URL and the search term, rank, and page it came from. Repeated results are dropped.

### How much does it cost to scrape Coursera?

**What is the price per Coursera result?**

The actor uses pay-per-event pricing: you pay per result saved, and platform usage is included.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `course-scraped` | $0.00089 (**$0.89 / 1,000**) | $0.00079 (**$0.79 / 1,000**) | $0.00069 (**$0.69 / 1,000**) | $0.00069 (**$0.69 / 1,000**) |

One `course-scraped` event is one row in the dataset. Duplicates that are skipped are not charged. The prefilled 20-result run costs about $0.02 on the Free plan, and 10,000 results cost $8.90. Apify's free plan includes monthly platform credits you can use to try the actor.

### Is it legal to scrape Coursera?

**Is scraping Coursera search results legal?**

The actor only collects catalog information that Coursera shows publicly to anyone, without logging in, and it doesn't collect personal data. Scraping public data is generally legal in many jurisdictions, but respect [Coursera's Terms of Use](https://www.coursera.org/about/terms) and don't republish copyrighted content such as course images without permission. Consult your lawyer if unsure. Read more in Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other scrapers and related Actors

| Actor | Best for |
|-------|----------|
| [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) | Job postings, to match skills with demand |
| [Dice Jobs Scraper](https://apify.com/parsebird/dice-jobs-scraper) | Tech job postings in the US |
| [Djinni Jobs Scraper](https://apify.com/parsebird/djinni-jobs-scraper) | Tech jobs in Ukraine and remote |
| [YouTube Transcript Scraper](https://apify.com/parsebird/youtube-transcript-scraper) | Transcripts of educational videos |
| [Substack Scraper](https://apify.com/parsebird/substack-scraper) | Newsletter posts and publications |

### FAQ

**How many results can I get?**
Up to 10,000 per search term or URL, which is the most Coursera returns for one search. To collect more, split the work into several searches, for example one per subject or product type.

**Why does a nonsense search still return results?**
Coursera's search matches by meaning, not only exact words, so it returns the closest courses it can find. Check `searchRank` and the result names.

**Why do I get fewer results than `totalElements`?**
Coursera sometimes lists the same course on two pages. The actor saves each course once per search, so the saved count can be slightly below `totalElements`.

**Does it scrape course details such as syllabus, instructors, or enrollment counts?**
No. It returns the data shown in Coursera search results. Use the `url` field to open the course page.

**Do I need a proxy?**
No. Requests go straight to Coursera. If Coursera starts limiting requests, the actor switches to Apify Proxy by itself.

**Can I run it on a schedule or from my app?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules), call it from the [API tab](https://apify.com/parsebird/coursera-scraper/api), or connect it to Make, Zapier, Google Sheets, or Slack through [integrations](https://apify.com/integrations).

**Where can I report issues?**
Open the **Issues** tab on the actor page with your input and run ID.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/coursera-scraper/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Add Coursera search terms, one per line, such as python, machine learning, or data analytics. Each term is searched separately.

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

Paste Coursera search URLs, e.g. https://www.coursera.org/search?query=data%20analytics\&productDifficultyLevel=Beginner. The URL's search term, filters, and sort order are used.

## `productTypes` (type: `array`):

Keep only these product types. Leave empty for all.

## `levels` (type: `array`):

Keep only these difficulty levels.

## `durations` (type: `array`):

Keep only these durations.

## `topics` (type: `array`):

Keep only these subjects.

## `languages` (type: `array`):

Language names as Coursera writes them, e.g. English, Spanish, Portuguese.

## `partners` (type: `array`):

Universities or companies offering the course, as Coursera names them, e.g. Google, IBM, University of Michigan.

## `skills` (type: `array`):

Skills as Coursera names them, e.g. Python Programming, Data Analysis.

## `freeOnly` (type: `boolean`):

Keep only results Coursera lists as free.

## `courseraPlusOnly` (type: `boolean`):

Keep only results included in a Coursera Plus subscription.

## `sortBy` (type: `string`):

Order of results, as on the Coursera search page.

## `maxResults` (type: `integer`):

Stop each search term or URL after this many results. Coursera shows at most 10,000 results per search.

## `maxPages` (type: `integer`):

Optional cap on result pages (100 results per page) for each search. Leave empty for no cap.

## `deduplicate` (type: `boolean`):

Save each course only once, even if several search terms find it.

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

No proxy is needed. The actor switches to Apify Proxy by itself if Coursera limits requests.

## Actor input object example

```json
{
  "queries": [
    "python"
  ],
  "freeOnly": false,
  "courseraPlusOnly": false,
  "maxResults": 20,
  "deduplicate": 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 = {
    "queries": [
        "python"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "queries": ["python"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "queries": [
    "python"
  ],
  "maxResults": 20
}' |
apify call parsebird/coursera-scraper --silent --output-dataset

```

## MCP server setup

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