# Udemy Scraper — Courses, Prices, Ratings & Reviews (`technicaldost/udemy-scraper-courses-prices-reviews`) Actor

Scrape Udemy courses by topic, category or URL: current sale price and list price, rating, students, reviews count, instructors, hours, level, language, what you'll learn, plus student reviews. No login, no API key.

- **URL**: https://apify.com/technicaldost/udemy-scraper-courses-prices-reviews.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** Education, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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 Scraper extracts **Udemy courses and student reviews** without a login or API key. For every course you get the **current (sale) price, list price and discount, average and recent rating, number of reviews and students, instructors, total video hours, lectures, level, language, captions, last update, category, topics, what you'll learn, requirements and target audience**. Find courses by **topic keyword** (e.g. `python`, `excel`, `machine learning`), **category or subcategory URL**, or paste **course URLs**, and filter by language, price, rating and level.

### What you get

- Topic search: a keyword is matched to Udemy's topic (e.g. python -> Python, 2,000+ courses).
- Category and subcategory URLs (e.g. /courses/development/web-development/) and single course URLs.
- Filters: language, paid or free, minimum rating (3.0-4.5), level; sort by popularity, highest rated or newest.
- Live prices from Udemy's pricing service: current price, list price and discount %.
- Rich course details: rating distribution, recent rating, objectives, requirements, audience, captions, badges (Bestseller, Highest Rated, New).
- Student reviews with rating, text, date, reviewer display name and instructor response; option to keep only reviews with text.

### How to use Udemy Scraper

1. Enter **Topics** (e.g. `python`) and/or paste **Udemy URLs** (topic, category, subcategory or course pages).
2. Set filters (language, price, rating, level), the **sort order** and **Max courses per topic/URL**.
3. Choose **What to save**: courses, reviews or both.
4. Run and export to JSON, CSV or Excel, or send to Google Sheets, Make, Zapier or an AI agent.

### Input example

```json
{
  "searchTerms": [
    "python"
  ],
  "maxCoursesPerSearch": 50,
  "sortBy": "popularity",
  "language": "en",
  "minRating": "4.5"
}
```

All fields are described in the **Input** tab.

### Output example

```json
{
  "type": "course",
  "courseId": 1565838,
  "title": "The Complete Full-Stack Web Development Bootcamp",
  "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/",
  "headline": "Become a Full-Stack Web Developer with just ONE course. HTML, CSS, Javascript, Node, React, PostgreSQL, Web3 and DApps",
  "isPaid": true,
  "price": 19.99,
  "originalPrice": 124.99,
  "discountPercent": 84,
  "currency": "USD",
  "rating": 4.68,
  "ratingRecent": 4.67,
  "reviewsCount": 475700,
  "studentsCount": 1594925,
  "instructors": [
    "Dr. Angela Yu, Developer and Lead Instructor"
  ],
  "instructorUrls": [
    "https://www.udemy.com/user/4b4368a3-b5c8-4529-aa65-2056ec31f37e/"
  ],
  "level": "All Levels",
  "language": "English",
  "locale": "en_US",
  "captionLanguages": [
    "English",
    "Arabic [Auto]",
    "Bulgarian [Auto]",
    "Czech [Auto]",
    "Danish [Auto]",
    "Dutch [Auto]",
    "Estonian [Auto]",
    "Filipino [Auto]",
    "Finnish [Auto]",
    "French [Auto]",
    "German [Auto]",
    "Greek [Auto]",
    "Hebrew [Auto]",
    "Hindi [Auto]",
    "Hungarian [Auto]",
    "Indonesian [Auto]",
    "Italian [Auto]",
    "Japanese [Auto]",
    "Korean [Auto]",
    "Lithuanian [Auto]",
    "Polish [Auto]",
    "Portuguese [Auto]",
    "Romanian [Auto]",
    "Simplified Chinese [Auto]",
    "Slovak [Auto]",
    "Spanish [Auto]",
    "Swedish [Auto]",
    "Thai [Auto]",
    "Turkish [Auto]",
    "Ukrainian [Auto]",
    "Vietnamese [Auto]"
  ],
  "contentInfo": "62 total hours",
  "videoLengthHours": 61.2,
  "lecturesCount": 374,
  "practiceTestsCount": 0,
  "badges": [
    "Bestseller"
  ],
  "lastUpdated": "2025-11-24",
  "publishedAt": "2018-10-25T21:34:15Z",
  "category": "Development",
  "subcategory": "Web Development",
  "topics": [
    "JavaScript",
    "MongoDB",
    "Node.Js",
    "Web Development"
  ],
  "objectives": [
    "Build 16 web development projects for your portfolio, ready to apply for junior developer jobs.",
    "Learn the latest technologies, including Javascript, React, Node and even Web3 development.",
    "After the course you will be able to build ANY website you want."
  ],
  "requirements": [
    "No programming experience needed - I'll teach you everything you need to know",
    "A computer with access to the internet",
    "No paid software required",
    "I'll walk you through, step-by-step how to get all the software installed and set up"
  ],
  "targetAudience": [
    "If you want to learn to code through building fun and useful projects, then take this course.",
    "If you want to start your own startup by building your own websites and web apps.",
    "If you are a seasoned programmer, then take this course to to get up to speed quickly with the latest frameworks and NodeJS",
    "If you want to take ONE COURSE and learn everything you need to know about web development, take this course"
  ],
  "ratingDistribution": {
    "1": 2741,
    "2": 3079,
    "3": 21308,
    "4": 124313,
    "5": 324259
  },
  "description": "Welcome to the Complete Web Development Bootcamp, the only course you need to learn to code and become a full-stack web developer. With 150,000+ ratings and a 4.8 average, my Web Development course is one of the HIGHEST RATED courses in the history of Udemy!\nAt 62+ hours, this Web Development course...",
  "hasCertificate": true,
  "imageUrl": "https://img-c.udemycdn.com/course/750x422/1565838_e54e_18.jpg",
  "source": "https://www.udemy.com/course/the-complete-web-development-bootcamp/",
  "scrapedAt": "2026-10-26T21:14:38.546Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `type` | course or review. |
| `courseId` | Udemy course ID. |
| `title` | Course title. |
| `url` | Course URL. |
| `headline` | Course subtitle. |
| `isPaid` | Paid course. |
| `price` | Current price (USD). |
| `originalPrice` | List price (USD). |
| `discountPercent` | Current discount, %. |
| `currency` | Currency. |
| `rating` | Average rating, 1-5. |
| `ratingRecent` | Recent average rating. |
| `reviewsCount` | Number of ratings. |
| `studentsCount` | Enrolled students. |
| `instructors` | Instructor names. |
| `instructorUrls` | Instructor profile URLs. |
| `level` | Level. |
| `language` | Course language. |
| `locale` | Locale code. |
| `captionLanguages` | Caption languages. |
| `contentInfo` | Length as shown, e.g. 61.5 total hours. |
| `videoLengthHours` | Video hours. |
| `lecturesCount` | Lectures. |
| `practiceTestsCount` | Practice tests. |
| `badges` | Bestseller, Highest Rated, New... |
| `lastUpdated` | Last update date. |
| `publishedAt` | Publish time. |
| `category` | Category. |
| `subcategory` | Subcategory. |
| `topics` | Udemy topics. |
| `objectives` | What you'll learn. |
| `requirements` | Requirements. |
| `targetAudience` | Who this course is for. |
| `ratingDistribution` | Count of ratings by stars. |
| `description` | Course description (text). |
| `hasCertificate` | Certificate of completion. |
| `imageUrl` | Course image. |
| `source` | Topic or URL that found the course. |
| `courseTitle` | Course title (review rows). |
| `courseUrl` | Course URL (review rows). |
| `reviewId` | Review ID. |
| `text` | Review text (empty for star-only reviews). |
| `createdAt` | Review date. |
| `modifiedAt` | Last edit. |
| `userName` | Reviewer display name. |
| `instructorResponse` | Instructor reply, if any. |
| `scrapedAt` | When the row was scraped. |

Export results as JSON, CSV, Excel, XML or HTML, or read them with the API.

### Use cases

- Course creators: research demand, pricing and ratings of competing courses before you build yours.
- Price and discount tracking for Udemy sales; schedule daily runs.
- EdTech and affiliate sites: build course catalogs with ratings, prices and student counts.
- Review analysis: what students like and dislike in the top courses of a topic.
- Market research on skills trends: newest and most popular courses per category.

### How much does Udemy Scraper cost?

This Actor uses **pay-per-event** pricing: **$0.0015 per course** ($1.5 per 1,000). Platform usage is included. Reviews cost **$0.0003 each** ($0.30 per 1,000). There is no start fee; topics or URLs that return nothing are free.

Set **Maximum cost per run** in the run options to cap your spend; the Actor stops when the limit is reached.

### Use Udemy Scraper with AI agents (MCP)

Give Claude, ChatGPT, Cursor or any MCP client this Actor as a tool through the hosted [Apify MCP server](https://mcp.apify.com):

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=technicaldost/udemy-scraper-courses-prices-reviews" --header "Authorization: Bearer YOUR_APIFY_TOKEN"
```

Or in a JSON MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=technicaldost/udemy-scraper-courses-prices-reviews",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

The tool is named `technicaldost--udemy-scraper-courses-prices-reviews`. Ask your agent, for example, to *"run Udemy Scraper with {"searchTerms": \["python"], "maxCoursesPerSearch": 50, "sortBy": "popularity", "language": "en", "minRating": "4.5"}"*.

### Run Udemy Scraper via API

```bash
curl -X POST "https://api.apify.com/v2/acts/technicaldost~udemy-scraper-courses-prices-reviews/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["python"], "maxCoursesPerSearch": 50, "sortBy": "popularity", "language": "en", "minRating": "4.5"}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("technicaldost/udemy-scraper-courses-prices-reviews").call(run_input={"searchTerms": ["python"], "maxCoursesPerSearch": 50, "sortBy": "popularity", "language": "en", "minRating": "4.5"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('technicaldost/udemy-scraper-courses-prices-reviews').call({"searchTerms": ["python"], "maxCoursesPerSearch": 50, "sortBy": "popularity", "language": "en", "minRating": "4.5"});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Integrations

Schedule runs (daily, hourly) in Apify Console and send results to Google Sheets, Slack, Make, Zapier, n8n, Airbyte or your own webhook.

### FAQ

#### Do I need a Udemy account?

No. The Actor reads the same public data udemy.com shows to logged-out visitors.

#### Why topics instead of free-text search?

Udemy's keyword search page is protected and changes often, so many scrapers return nothing. The Actor maps your keyword to Udemy's matching topic page (the closest Udemy topic), which lists the same courses reliably. Paste a topic or category URL for exact control.

#### Which price is returned?

price is what a US visitor pays now (often a sale price); originalPrice is the list price; discountPercent is the difference. Prices are in USD.

#### How many reviews can I get?

Up to 10,000 per course (Udemy's limit), newest first. Turn on 'Only reviews with text' to skip rating-only reviews.

#### Is personal data collected?

Only the reviewer display name Udemy shows publicly next to each review. No emails or profiles.

#### Is it legal to scrape this data?

The Actor collects publicly available information only and does not log in or bypass access controls. Use the data in line with the website's terms and the laws that apply to you, especially when processing personal data.

### Related Actors

More tools from the same developer that work well together with this one:

- [YouTube Transcript Scraper | $1/1K · SRT & VTT](https://apify.com/technicaldost/youtube-transcript-scraper-plus): Extract YouTube transcripts, captions and subtitles in bulk.
- [LinkedIn Jobs Scraper — No Login, Full Job Details](https://apify.com/technicaldost/linkedin-jobs-scraper-no-login): Scrape LinkedIn job postings without login or cookies: title, company, location, salary, posted date, applicants, seniority, employment type, industries and…
- [Competitor Review Analyzer: Brand Comparison](https://apify.com/technicaldost/competitor-review-gap-analyzer): Compare imported customer-feedback records by brand to surface recurring complaints, strengths and product gaps with traceable evidence.
- [Google Trends Daily Scraper API](https://apify.com/technicaldost/google-trends-scraper): Get daily Google trending searches (RSS) and interest-over-time timelines for keywords.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords matched to Udemy topics, e.g. python, excel, machine learning, digital marketing.

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

Topic (/topic/python/), category (/courses/development/), subcategory (/courses/development/web-development/) or course (/course/.../) URLs.

## `output` (type: `string`):

Course rows, review rows, or both.

## `maxCoursesPerSearch` (type: `integer`):

Up to 10,000.

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

Order of courses.

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

Optional.

## `price` (type: `string`):

Paid, free or both.

## `minRating` (type: `string`):

Optional.

## `level` (type: `string`):

Optional.

## `includeDetails` (type: `boolean`):

Adds objectives, requirements, audience, rating distribution, video hours, category and topics (1 extra request per course).

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

Used when What to save includes reviews. Newest first, up to 10,000.

## `reviewsWithTextOnly` (type: `boolean`):

Skip star-only reviews.

## Actor input object example

```json
{
  "searchTerms": [
    "python"
  ],
  "startUrls": [],
  "output": "courses",
  "maxCoursesPerSearch": 10,
  "sortBy": "popularity",
  "language": "any",
  "price": "any",
  "minRating": "any",
  "level": "any",
  "includeDetails": true,
  "maxReviewsPerCourse": 100,
  "reviewsWithTextOnly": false
}
```

# 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 = {
    "searchTerms": [
        "python"
    ],
    "startUrls": [],
    "maxCoursesPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/udemy-scraper-courses-prices-reviews").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 = {
    "searchTerms": ["python"],
    "startUrls": [],
    "maxCoursesPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/udemy-scraper-courses-prices-reviews").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 '{
  "searchTerms": [
    "python"
  ],
  "startUrls": [],
  "maxCoursesPerSearch": 10
}' |
apify call technicaldost/udemy-scraper-courses-prices-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,technicaldost/udemy-scraper-courses-prices-reviews"
        }
    }
}
```

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/fvt3GnO49IJdxhbbi/builds/42Fz0s0uESbaWvqt4/openapi.json
