# Udemy Scraper \[💰$1.5/1K] | Courses | Curriculum | Reviews (`ahmed_jasarevic/udemy-scraper`) Actor

Scrape Udemy course data — price, discount, rating, students, instructors, full curriculum and individual reviews — for e-learning market research, affiliate price tracking and AI training data. API-based, no browser, two separate datasets.

- **URL**: https://apify.com/ahmed\_jasarevic/udemy-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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

## Udemy Course Scraper

Scrape **Udemy course data for e-learning market research and online-course price tracking** — price and discount, rating, review count, student count, instructor, full curriculum and individual review text from any Udemy course landing page, with no browser and no official API.

### Main Use Cases

- **Online course price tracking** — monitor Udemy price and discount changes over time to time affiliate promotions.
- **Course benchmarking for creators** — compare competitor courses: curriculum structure, pricing, ratings and review sentiment.
- **E-learning market research** — build datasets of course supply, pricing and demand signals across categories.
- **AI training data** — clean, structured JSON (curriculum, reviews, metadata) ready for LLM fine-tuning or RAG pipelines.
- **Course review analysis** — extract individual review texts, ratings, reviewer profiles and instructor responses.

### How It Works

This Udemy scraper is API-first: it reads the full course object from the server-rendered Next.js flight-data payload (Udemy's internal `CLPCourse` GraphQL query) and enriches it with Udemy's internal pricing and reviews JSON APIs. Requests are retried across five request "personas" (desktop browser, Udemy Android app fingerprint, auto-generated Chrome and Safari fingerprints, bare HTTP client) until one returns 200 — so runs stay cheap, plain-HTTP, and resilient to Cloudflare. If every persona is blocked, all HTML-derived fields (title, rating, students, curriculum, instructors, category, ...) still come back.

Courses are stored in the **default dataset**; individual reviews land in a **separate `reviews` dataset** that can be billed separately per review.

### Track Udemy Course Prices Without an Official Udemy API

Udemy has no public API for course pricing or catalog data. This actor reads the same internal JSON surface the website renders, so you get current price, list price and discount percentage per course (`pricingVia` reports which request persona succeeded). Set a schedule to track price drops across your watchlist — a common affiliate-marketing workflow. Note: prices are geo-dependent (Udemy prices by country).

### Benchmark E-Learning Courses: Curriculum, Ratings & Reviews

Every course record includes the full **curriculum** (sections + lectures with titles, types, durations), **rating**, **review count**, **student count**, and instructor identities — everything needed for a competitor course analysis or an edtech market report. Enable `includeReviews` and `maxReviewsPerCourse` to also pull individual review text with reviewer job titles and instructor responses into the separate Reviews dataset.

### Input

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `startUrls` | array | **Yes** | — | Udemy course URLs (`https://www.udemy.com/course/...`) or bare course slugs (`the-complete-web-development-bootcamp`). |
| `maxItems` | integer | No | `50` | Maximum number of courses to scrape. |
| `includeCurriculum` | boolean | No | `true` | Include full curriculum (sections and lectures with titles, durations and types). |
| `includeReviews` | boolean | No | `false` | Fetch individual course reviews (review text, rating, author) from Udemy's reviews API. Best-effort. |
| `maxReviewsPerCourse` | integer | No | `20` | Max review texts per course (1–500). Values above 100 page through the API. Only used when `includeReviews` is on. |
| `proxy` | object | No | off | Standard Apify proxy picker — enable if you hit blocks at scale. |

### Example Input

```json
{
  "startUrls": [
    "https://www.udemy.com/course/the-complete-web-development-bootcamp/",
    "the-complete-python-bootcamp"
  ],
  "maxItems": 50,
  "includeCurriculum": true,
  "includeReviews": true,
  "maxReviewsPerCourse": 100
}
```

### Output — Courses dataset (default)

One item per course. Key columns in the `overview` view: `title`, `url`, `instructors`, `category`, `rating`, `reviewCount`, `students`, `price`, `listPrice`, `discountPercent`, `level`, `duration`.

| Field group | Fields |
|-------------|--------|
| Identity | `url`, `courseId`, `title`, `headline`, `description` |
| Taxonomy | `category`, `subcategory`, `primaryTopic`, `level`, `locale`, `duration`, `hasCertificate` |
| Instructors | `instructors[]` (id, name, url) |
| Social proof | `rating`, `reviewCount`, `students`, `totalReviewsAvailable`, `moreReviewsAvailable` |
| Pricing | `price`, `listPrice`, `discountPercent`, `pricingVia` |
| Learning | `learningOutcomes[]`, `curriculum` (sections → items with id, title, type, duration) |

### Example Output — Courses

```json
{
  "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/",
  "courseId": "1565838",
  "title": "The Complete Full-Stack Web Development Bootcamp",
  "category": "Development",
  "subcategory": "Web Development",
  "instructors": [{ "id": "31334738", "name": "Dr. Angela Yu, Developer and Lead Instructor", "url": "https://www.udemy.com/user/..." }],
  "rating": 4.66,
  "reviewCount": 474751,
  "students": 1590698,
  "price": "€84.99",
  "listPrice": "€84.99",
  "discountPercent": null,
  "level": "ALL_LEVELS",
  "duration": "61h 53m 57s",
  "hasCertificate": true,
  "learningOutcomes": ["Build 16 web development projects for your portfolio..."],
  "curriculum": {
    "contentCounts": { "lecturesCount": 362, "quizzesCount": 0 },
    "sections": [
      { "id": "2281624", "title": "Front-End Web Development", "items": [{ "id": "12638830", "title": "What You'll Get in This Course", "type": "VIDEO_LECTURE", "durationInSeconds": 167 }] }
    ]
  }
}
```

### Output — Reviews dataset (optional, `includeReviews`)

One item per individual review. Key columns in the `overview` view: `courseTitle`, `reviewer.displayName`, `rating`, `content`, `createdFormatted`, `instructorResponse.content`, `courseUrl`. Full records also include `reviewer.jobTitle`, `reviewer.url`, `instructorResponse.instructor.displayName`, timestamps, and more.

```json
{
  "courseUrl": "https://www.udemy.com/course/the-complete-python-bootcamp/",
  "courseTitle": "The Complete Python Bootcamp From Zero to Hero in Python",
  "reviewId": 246225329,
  "rating": 4.5,
  "content": "A great course, very well explained!",
  "createdFormatted": "a day ago",
  "reviewer": { "displayName": "Shilpa Santosh", "jobTitle": "Software Developer", "url": "https://www.udemy.com/user/shilpa-santosh-2/" },
  "instructorResponse": { "content": "Thank you for the feedback!", "instructor": { "displayName": "Jose Portilla" } }
}
```

Download either dataset as **JSON, HTML, CSV or Excel** from the Storage tab (both datasets appear under Storage → Courses + Reviews).

### Extract Udemy Reviews for Course Quality Analysis

Enable `includeReviews` to pull individual review texts for sentiment analysis — review content, star rating, reviewer profile (name, job title, avatar, URL), timestamps and instructor responses. `maxReviewsPerCourse` up to 500 lets you build a substantial review corpus for a single course; the reviewer `jobTitle` field is a useful signal for audience-profiling research.

### Integrations & Automation

- **Apify API** — call the actor from your affiliate, research or ed-tech product.
- **Webhooks** — notify your Slack/CRM when a run finishes.
- **Scheduling** — run daily or weekly for price-drop monitoring and review tracking.
- **Export** — JSON, CSV, HTML, Excel.

*Recommended schedule:* **daily** for price tracking, **weekly** for course benchmarking snapshots.

### Related Actors

- [Udemy Course Scraper 📚](https://apify.com/easyapi/udemy-course-scraper) — the most-used Udemy actor on the Store (e-learning cluster authority).
- [Udemy Course Reviews Scraper 📚](https://apify.com/easyapi/udemy-course-reviews-scraper) — Udemy review extraction by the same developer.
- [Udemy Course Scraper](https://apify.com/silentflow/udemy-scraper-ppe) — 40+ fields, keyword and category browsing.
- [Udemy Course/Reviews Scraper](https://apify.com/mikolabs/udemy-course-scraper) — combined course + reviews extraction.
- [Udemy Course Scraper](https://apify.com/crawlerbros/udemy-scraper) — search-by-keyword and category browsing.

### FAQ

#### Why use this actor instead of the official Udemy API?

Udemy does not offer a public API for course catalog, pricing, curriculum or review data. This actor reads the same internal JSON surface Udemy's own website renders (Next.js flight payload + internal pricing/reviews APIs) — no API key, no OAuth, no browser rendering. Requests rotate across desktop/mobile-app/fresh-fingerprint personas to stay reliable.

#### What are alternatives to this actor / Udemy course data?

- [easyapi/udemy-course-scraper](https://apify.com/easyapi/udemy-course-scraper) and [easyapi/udemy-course-reviews-scraper](https://apify.com/easyapi/udemy-course-reviews-scraper).
- [silentflow/udemy-scraper-ppe](https://apify.com/silentflow/udemy-scraper-ppe) and [mikolabs/udemy-course-scraper](https://apify.com/mikolabs/udemy-course-scraper).
- Direct Udemy page access via a general web scraper (browser-based, slower and more expensive).

#### How can I track Udemy course price drops?

Schedule this actor **daily** on a watchlist of course URLs, enable `includeReviews` off, and compare `price` / `discountPercent` between runs. Use the Apify API to diff consecutive dataset exports.

#### What is the best way to build an online-course market research dataset?

Scrape category-representative course URLs in bulk (`maxItems` up to unlimited on paid plans), keep `includeCurriculum` on, and aggregate `category`, `subcategory`, `rating`, `students`, `price` and `discountPercent` in your analysis layer. The Reviews dataset adds qualitative sentiment on top.

### For AI Agents & LLM Apps

- **Purpose:** returns one structured course record per Udemy URL/slug in the default dataset (identity, taxonomy, rating, students, pricing, learning outcomes, curriculum), and optionally one review record per review in the `reviews` dataset.
- **Minimal input:**

```json
{ "startUrls": ["the-complete-web-development-bootcamp"], "maxItems": 10 }
```

- **Variant input — course + reviews:**

```json
{
  "startUrls": ["the-complete-python-bootcamp"],
  "includeCurriculum": true,
  "includeReviews": true,
  "maxReviewsPerCourse": 100
}
```

Behaviors an agent should know:

- `startUrls` is **required** — accept full course URLs or bare slugs.
- `includeReviews: false` by default — enabling it adds one API call per course and writes to the **separate `reviews` dataset**, billed per review.
- `maxReviewsPerCourse` only applies when `includeReviews` is on; values >100 page through Udemy's API (max 500).
- Pricing/review fields are best-effort — if Udemy's internal APIs are blocked, all HTML-derived fields are still returned (`pricingVia` reports how pricing was fetched; `totalReviewsAvailable`/`moreReviewsAvailable` summarize review coverage).
- Prices are geo-dependent and may appear with the currency of the requesting locale.
- **Billing:** pay-per-event — `$0.0015` per course record, `$0.0008` per review record.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Udemy, Inc. It accesses only publicly available course metadata and review text — it does not bypass login walls or access paid content. Users are responsible for complying with Udemy's Terms of Service and applicable law; review scraping results may include publicly posted reviewer names and job titles, which should be handled in line with data-protection rules (e.g. GDPR/CCPA where applicable) and must not be used for unsolicited outreach. If you still hit blocks at scale, enable the Apify proxy input and retry.

### SEO Keywords

udemy scraper, udemy course data, udemy api alternative, udemy price tracking, course price monitoring, online course market research, edtech market research, udemy reviews, udemy course reviews, curriculum data, ai training data, course benchmarking, udemy course prices, udemy discount tracking, e-learning dataset, online course pricing, udemy ratings, instructor data, course sentiment analysis, udemy search alternative, course quality analysis, learning marketplace data

# Actor input Schema

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

One or more Udemy course landing-page URLs (e.g. https://www.udemy.com/course/the-complete-web-development-bootcamp/) or just the course slug (e.g. the-complete-web-development-bootcamp).

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

Maximum number of courses to scrape.

## `includeCurriculum` (type: `boolean`):

Include the full curriculum (sections and lectures with titles, durations and types) in the output.

## `includeReviews` (type: `boolean`):

Fetch individual course reviews (review text, rating, author) from Udemy's internal reviews API. Best-effort: if the API is blocked, the actor still returns all other fields.

## `maxReviewsPerCourse` (type: `integer`):

Maximum number of review texts to fetch per course (only used when 'Include reviews text' is enabled). Values above 100 are fetched by paging through the reviews API (max 500).

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/"
    }
  ],
  "maxItems": 50,
  "includeCurriculum": true,
  "includeReviews": false,
  "maxReviewsPerCourse": 20,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `courses` (type: `string`):

Scraped course metadata (one item per course).

## `reviews` (type: `string`):

Individual course reviews (one item per review).

# 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 = {
    "startUrls": [
        {
            "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/"
        }
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/udemy-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 = {
    "startUrls": [{ "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/" }],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/udemy-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 '{
  "startUrls": [
    {
      "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/"
    }
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/udemy-scraper --silent --output-dataset

```

## MCP server setup

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