# Udemy Course Scraper (`parsebird/udemy-course-scraper`) Actor

Scrape Udemy courses by course, category, topic, or search URL. Get price, discount, rating, reviews, students, instructors, curriculum counts, requirements, and objectives. Export as JSON, CSV, or Excel.

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

## Pricing

from $1.49 / 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?

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 from course, category, subcategory, topic, and search URLs, with prices, discounts, ratings, students, instructors, and curriculum counts.

<table><tr>
<td style="border-left:4px solid #A435F0;padding:12px 16px;font-weight:600">
Turn Udemy's catalog into a clean dataset: paste any course or listing link, keep your Udemy filters, and see prices and sale discounts for the country you choose.
</td>
</tr></table>

##### Copy to your AI assistant

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

```text
Apify actor "parsebird/udemy-course-scraper" (Udemy Course Scraper) returns course data from Udemy. Call it with the apify-client package: client.actor("parsebird/udemy-course-scraper").call(run_input={"start_urls": [{"url": "https://www.udemy.com/topic/python/"}], "max_items_per_url": 100}). Provide at least one of: course_urls (array of {url}; https://www.udemy.com/course/python-3-do-zero-ao-avancado/), start_urls (array of {url}; category https://www.udemy.com/courses/development/, subcategory https://www.udemy.com/courses/development/web-development/, topic https://www.udemy.com/topic/python/, or search https://www.udemy.com/courses/search/?q=python, with Udemy filters kept). Optional: max_items_per_url (integer, default 60, 0 = everything up to 10,000 per URL), start_page (integer, default 1, 60 courses per page), price_country (two-letter code, default "US"), max_concurrency (integer, default 20, up to 30). Output, one row per course: id, title, url, price, price_detail, is_paid, instructors, visible_instructors, language, locale, category, subcategory, description, headline, created, published_time, last_update_date, num_subscribers, discount, discount_price, rating, avg_rating, num_reviews, rating_distribution, num_quizzes, num_lectures, num_curriculum_items, num_practice_tests, num_coding_exercises, features, image, primary_category, primary_subcategory, requirements_data, what_you_will_learn_data, labels, target_audiences, objectives, estimated_content_length, content_info, instructional_level, has_certificate, caption_languages, badges, price_country, source_url, scraped_at. Pay per event: apify-actor-start, result. API docs: https://apify.com/parsebird/udemy-course-scraper/api. Get a token: https://console.apify.com/settings/integrations
```

### What is Udemy Course Scraper?

**Udemy Course Scraper** collects public course data from [Udemy](https://www.udemy.com/) and returns it as a structured dataset. It works as a **Udemy API alternative**: paste a course link or a category, topic, or search link, press Start, and download the results.

Each row is one course, with its **price, discount, rating, review count, student count, instructors, curriculum counts, requirements, and learning objectives**.

### What can Udemy Course Scraper do?

- 🎓 **Scrape single courses.** Paste any number of course links.
- 📚 **Scrape categories, subcategories, and topics.** Collect the courses Udemy lists under a link such as `/courses/development/` or `/topic/python/`.
- 🔎 **Scrape search results.** Paste a search link such as `/courses/search/?q=python`.
- 🎯 **Keep your Udemy filters.** Language, level, price, rating, length, captions, and sort order in a pasted link are applied.
- 🌍 **Compare prices by country.** Udemy sets currency, price, and sale discounts by visitor country. Choose one of 30 countries.
- 🧹 **Avoid duplicates.** A course found through several links is saved and charged once per run.

On the Apify platform you can also [schedule runs](https://docs.apify.com/platform/schedules) to track prices and ratings, call the Actor through the [API](https://docs.apify.com/api/v2), connect it to [Make, Zapier, Google Sheets, and other integrations](https://docs.apify.com/platform/integrations), and export in JSON, CSV, Excel, XML, or HTML.

### What data can you extract from Udemy?

| Field | Description |
|-------|-------------|
| `id`, `title`, `headline`, `description`, `url` | Course identity and sales text (`description` is HTML) |
| `price`, `price_detail` | Current price as displayed, and list price with amount and currency |
| `discount`, `discount_price` | Sale details when a discount is active, including percent and campaign |
| `is_paid`, `price_country` | Whether the course is paid, and the country the prices are for |
| `rating`, `avg_rating`, `num_reviews`, `rating_distribution` | Ratings and the count for each star level |
| `num_subscribers` | Enrolled students |
| `instructors`, `visible_instructors` | Instructor names, plus job titles, photos, and profile links |
| `language`, `locale`, `caption_languages` | Course language and available captions |
| `category`, `subcategory`, `primary_category`, `primary_subcategory`, `labels` | Where the course sits in Udemy's catalog |
| `num_lectures`, `num_quizzes`, `num_curriculum_items`, `num_practice_tests`, `num_coding_exercises` | Curriculum counts |
| `estimated_content_length`, `content_length_video`, `content_info` | Course length in minutes and seconds, and as displayed |
| `requirements_data`, `what_you_will_learn_data`, `objectives`, `target_audiences` | Requirements, objectives, and intended students |
| `instructional_level`, `has_certificate`, `badges` | Level, certificate, and badges such as Bestseller |
| `created`, `published_time`, `last_update_date` | Course dates |

### How to scrape Udemy courses

1. Open [Udemy Course Scraper](https://apify.com/parsebird/udemy-course-scraper) and go to the Input tab.
2. Paste links in **Course URLs** or **Category, topic, or search URLs**. To use filters, apply them on Udemy first and copy the resulting link.
3. Set **Max courses per URL** to control the run size and cost.
4. Pick a **Price country** if you need prices outside the US.
5. Press **Start** and wait for the run to finish.
6. Download your courses in JSON, CSV, Excel, XML, or HTML from the Output tab.

### Input parameters

Provide at least one URL in `course_urls` or `start_urls`.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| course_urls | array | No | — | Udemy course URLs |
| start_urls | array | No | — | Udemy category, subcategory, topic, or search URLs |
| max_items_per_url | integer | No | 60 | Maximum courses saved from each listing URL. 0 means everything Udemy serves, up to 10,000 per URL |
| start_page | integer | No | 1 | Results page to start from. Each page holds up to 60 courses |
| price_country | string | No | US | Two-letter country code for prices, currency, and discounts |
| max_concurrency | integer | No | 20 | Courses loaded at the same time, up to 30 |

Example input:

```json
{
    "course_urls": [
        { "url": "https://www.udemy.com/course/python-3-do-zero-ao-avancado/" }
    ],
    "start_urls": [
        { "url": "https://www.udemy.com/courses/development/" },
        { "url": "https://www.udemy.com/topic/python/?lang=en&sort=newest" }
    ],
    "max_items_per_url": 60,
    "start_page": 1,
    "price_country": "US"
}
```

### Output example

Long fields are shortened here. Download results in JSON, CSV, Excel, XML, or HTML.

```json
{
    "id": 1565838,
    "title": "The Complete Full-Stack Web Development Bootcamp",
    "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/",
    "price": "$124.99",
    "price_detail": { "amount": 124.99, "currency": "USD", "price_string": "$124.99", "currency_symbol": "$" },
    "is_paid": true,
    "instructors": "Dr. Angela Yu",
    "visible_instructors": [
        {
            "id": 31334738,
            "title": "Dr. Angela Yu",
            "name": "Dr. Angela",
            "display_name": "Dr. Angela Yu",
            "job_title": "Developer and Lead Instructor",
            "image_100x100": "https://img-c.udemycdn.com/user/100x100/31334738_a13c_3.jpg",
            "initials": "DY",
            "url": "https://www.udemy.com/user/4b4368a3-b5c8-4529-aa65-2056ec31f37e/"
        }
    ],
    "language": "English",
    "category": "Development",
    "subcategory": "Web Development",
    "headline": "Become a Full-Stack Web Developer with just ONE course...",
    "created": "2018-02-22T12:02:33Z",
    "last_update_date": "2025-11-24",
    "num_subscribers": 1596112,
    "discount": null,
    "discount_price": null,
    "rating": 4.670647,
    "avg_rating": 4.6757493,
    "num_reviews": 475892,
    "num_lectures": 442,
    "num_quizzes": 12,
    "num_curriculum_items": 454,
    "image": "https://img-c.udemycdn.com/course/750x422/1565838_e54e_18.jpg",
    "requirements_data": ["No programming experience needed - I'll teach you everything you need to know"],
    "what_you_will_learn_data": ["Build 16 web development projects for your portfolio, ready to apply for junior developer jobs."],
    "labels": [
        { "id": 6368, "title": "JavaScript", "url": "https://www.udemy.com/topic/javascript/", "type": "topic", "display_name": "JavaScript" }
    ],
    "estimated_content_length": 3714,
    "content_info": "62 total hours",
    "instructional_level": "All Levels",
    "badges": ["Bestseller"],
    "price_country": "US",
    "source_url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/",
    "scraped_at": "2026-11-07T00:00:00+00:00"
}
```

### Use cases

- **Market research:** see which topics, levels, and languages draw the most students and reviews.
- **Price tracking:** schedule runs to follow prices and sale discounts, in one country or several.
- **Competitor analysis:** compare your courses with others on ratings, length, curriculum, and positioning.
- **Course planning:** study objectives, requirements, and target audiences of top courses in your topic.
- **Learning platforms and directories:** keep your own course catalog up to date.

### How to use the Udemy API alternative in Python and JavaScript

Python, using the [Apify API client for Python](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/udemy-course-scraper").call(run_input={
    "start_urls": [{"url": "https://www.udemy.com/topic/python/"}],
    "max_items_per_url": 100,
})

for course in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(course["title"], course["price"], course["rating"], course["num_subscribers"])
```

JavaScript, using the [Apify API client for JavaScript](https://docs.apify.com/api/client/js):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/udemy-course-scraper').call({
    start_urls: [{ url: 'https://www.udemy.com/topic/python/' }],
    max_items_per_url: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((course) => console.log(course.title, course.price, course.rating, course.num_subscribers));
```

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

This Actor uses pay-per-event pricing. Compute and proxy costs are included in the event prices, and your Apify plan sets your discount tier.

| Event | What it covers | Free | Bronze | Silver | Gold |
|-------|----------------|------|--------|--------|------|
| apify-actor-start | Once per run, per GB of memory (minimum one; one at the default 256 MB) | $0.005 | $0.005 | $0.005 | $0.005 |
| result | Each course saved | $2.99 / 1,000 | $2.49 / 1,000 | $1.99 / 1,000 | $1.49 / 1,000 |

On the Free tier, a run of 1,000 courses costs $2.995: the $0.005 start fee plus $2.99 for the courses. Courses that fail to load, are not public, or were already saved in the run are not charged. Choosing a price country costs nothing extra. Use [Maximum cost per run](https://docs.apify.com/platform/actors/running/runs-and-builds) to cap your spending: the Actor stops when the limit is reached.

### How does Udemy Course Scraper work?

1. It reads each link you paste and works out whether it is a course, category, subcategory, topic, or search.
2. For listings, it goes through the results page by page, applying any filters from the link, until it reaches your limit or the end.
3. It loads each course's public details and saves them as one row.
4. If you chose a price country other than the US, it adds that country's prices.

### FAQ

**How many courses can I get from one URL?**
Udemy serves at most 10,000 courses per listing, in 167 pages of up to 60. To reach more, use several subcategories, topics, or filtered links. Courses found through more than one link are saved once.

**How long does a run take?**
In our tests on the Apify platform, the default 60 courses took under 20 seconds, 2,000 courses from one category took about 5 minutes at the highest concurrency, and all of the Python topic took about 18 minutes at concurrency 10. That topic returned 3,763 courses against the 3,783 Udemy reported, because Udemy's reported total can differ slightly from the courses its pages serve.

**Does Max courses per URL apply to course links?**
No. It applies to each category, subcategory, topic, and search link. Every course link you paste is scraped.

**Why is `discount` empty for some courses?**
Udemy runs sales by country and time, so a course can be discounted in one country and at full price in another. In our tests, the same course showed a discount from India and full price from the US, Brazil, and Germany. `discount` and `discount_price` are empty when no sale is active for the chosen country.

**Does the Actor apply coupon codes from URLs?**
No. A `couponCode` in a course link is ignored, and the returned price is the public one for the chosen country.

**Why are `price_detail` and `discount` empty for a course?**
Free courses have no price. Those rows show `"price": "Free"` and `"is_paid": false`.

**Why is a course missing from my results?**
Some courses appear in listings but are not open to the public, such as Udemy Business content. Those are skipped without a charge, and the run log reports how many.

**Can I get lecture titles or course reviews?**
Not at this time. The Actor returns curriculum counts, the rating distribution, and review counts. Tell us in the [Issues tab](https://apify.com/parsebird/udemy-course-scraper/issues) if you need more.

**Do I need to set up a proxy?**
No. The Actor manages its own proxies, and that cost is included in the event prices.

**Can I schedule recurring runs?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any interval, then send results to your tools through [integrations](https://docs.apify.com/platform/integrations) or the [API](https://apify.com/parsebird/udemy-course-scraper/api).

**Something is not working. What should I do?**
Open a ticket in the [Issues tab](https://apify.com/parsebird/udemy-course-scraper/issues) with your run link, and we will look into it.

### Other Actors you may like

- [Coursera Scraper](https://apify.com/parsebird/coursera-scraper): courses, Specializations, and certificates from Coursera search
- [YouTube Transcript Scraper](https://apify.com/parsebird/youtube-transcript-scraper): transcripts from YouTube videos
- [Substack Scraper](https://apify.com/parsebird/substack-scraper): newsletters and posts from Substack
- [LinkedIn Jobs Scraper](https://apify.com/parsebird/linkedin-jobs-scraper): job postings from LinkedIn
- [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper): job listings from Indeed

### Is it legal to scrape Udemy?

This Actor collects only information that Udemy publishes on public course pages. It does not log in or access private data or course videos. Results can include personal data such as instructor names and photos, which laws such as the GDPR and CCPA protect. You are responsible for having a lawful basis for your use, respecting Udemy's terms, and following the rules that apply to you. If you are unsure, consult a lawyer. You can read more in Apify's post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

# Changelog

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

# Actor input Schema

## `course_urls` (type: `array`):

Add links to individual Udemy courses, such as https://www.udemy.com/course/python-3-do-zero-ao-avancado/.

## `start_urls` (type: `array`):

Add Udemy category, subcategory, topic, or search URLs. To use filters, apply them on Udemy and paste the resulting link: language, level, price, rating, length, and sort order are kept.

## `max_items_per_url` (type: `integer`):

Set the maximum number of courses to save from each category, topic, or search URL. Set 0 for everything Udemy serves, up to 10,000 per URL.

## `start_page` (type: `integer`):

Set the results page to start from on each category, topic, or search URL. Each page holds up to 60 courses.

## `price_country` (type: `string`):

Pick the country to see prices for. Udemy sets currency, price, and sale discounts by visitor country.

## `max_concurrency` (type: `integer`):

Set how many courses to load at the same time.

## Actor input object example

```json
{
  "course_urls": [
    {
      "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/"
    }
  ],
  "start_urls": [
    {
      "url": "https://www.udemy.com/courses/development/"
    }
  ],
  "max_items_per_url": 10,
  "start_page": 1,
  "price_country": "US",
  "max_concurrency": 20
}
```

# Actor output Schema

## `dataset` (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 = {
    "course_urls": [
        {
            "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/"
        }
    ],
    "start_urls": [
        {
            "url": "https://www.udemy.com/courses/development/"
        }
    ],
    "max_items_per_url": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/udemy-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 = {
    "course_urls": [{ "url": "https://www.udemy.com/course/the-complete-web-development-bootcamp/" }],
    "start_urls": [{ "url": "https://www.udemy.com/courses/development/" }],
    "max_items_per_url": 10,
}

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

```

## MCP server setup

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