Udemy Course Scraper avatar

Udemy Course Scraper

Pricing

from $2.30 / 1,000 results

Go to Apify Store
Udemy Course Scraper

Udemy Course Scraper

Udemy scraper that extracts course data from topic pages and course URLs: titles, ratings, review counts, students, prices, instructors, objectives, requirements, curriculum and caption languages. Our 2026 test run returned 18 courses in 63 seconds, 51 fields each. Export to JSON, CSV or Excel.

Pricing

from $2.30 / 1,000 results

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

1

Bookmarked

249

Total users

132

Monthly active users

26 minutes ago

Last modified

Features

Limited permissions

Share

Udemy Course Scraper | Prices, Discounts, Reviews and Instructors (2026)

Udemy courses, 49 fields each. Search terms or links. 36% cheaper than the top alternative.

From SilentFlow. Creators of Facebook Search Scraper and JD Products Scraper (#1 for “jd scraper” in Apify Store search), with 890,000+ combined lifetime runs.

Every Udemy course behind a keyword, a topic or an instructor, with today's price, its discount and coupon, students, curriculum, written reviews and the instructor's profile. 50 courses in about 3 minutes.

Why choose this actor?

Copying Udemy prices into a spreadsheet one course at a time? Getting the dozen courses a topic page shows when the topic holds thousands? Need the reviews and the instructor's links, not just the course title?

  • The whole topic, not one page. A topic link reaches every course of the topic through Udemy's own search: 3,817 courses for Python on our last run, where the topic page itself lists about a dozen. Keywords and search links go up to 10,000 courses each.
  • The price a visitor pays today. Each course comes with its sale price, list price, discount percent, the campaign coupon behind it and the end of the sale, read for the whole batch at once. Every one of the 50 rows of our last keyword run carried its sale and list price.
  • Reviews and instructors on the same row. Ask for up to 10,000 written reviews per course (text, stars, date, reviewer, instructor reply) and the instructor's bio, social links, students, courses and reviews. Our test run returned 6 filtered courses with 5 reviews and a full instructor profile each in 28 seconds.
  • Udemy's own filters. Language, level, minimum rating and free or paid are applied by Udemy before a course is read, so you only collect what you asked for. A search link copied from your browser keeps its filters, sort and duration.
  • 57 fields per course. Description, learning objectives, requirements, target audience, curriculum sections, students, lectures, hours, quizzes, practice tests, captions, category, subcategory, badges, publication and update dates.

Try Udemy Course Scraper free

Try your first courses

Paste this input in the Input tab and press Start. It reads the Python topic and stops at 50 courses:

{
"startUrls": [{ "url": "https://www.udemy.com/topic/python/" }],
"maxItems": 50
}

The free Apify plan is enough to run it. Rows appear in the dataset in groups of five while the run goes on, so you can open the Output tab after about 20 seconds.

SilentFlow · Udemy Course suite
  Udemy Course Scraper
You are here
  Udemy Scraper
Udemy Scraper

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the Udemy Course Scraper on Apify: silentflow/udemy-scraper-ppe
Input (all optional, give startUrls or searches):
- startUrls (array of {url}): Udemy topic (/topic/python/), search (/courses/search/?q=excel&lang=fr&ratings=4.5), category, instructor (/user/joseportilla/) or course (/course/100-days-of-code/) pages
- searches (array of strings): keywords, as typed in Udemy's search bar
- maxItems (integer, default 50): total courses to collect
- languages (array): course language codes, e.g. ["en", "fr", "es"]
- levels (array): "all", "beginner", "intermediate", "expert"
- minRating (string): "4.5", "4.0", "3.5" or "3.0"
- price (string): "free" or "paid"
- maxReviewsPerCourse (integer, default 0): newest written reviews added to each course
- includeInstructorProfiles (boolean, default false): instructor bio, social links and audience on each course
- debugMode (boolean, default false)
Output: one row per course (57 fields, 63 with profiles and reviews):
- id (integer), url, title, headline, description (HTML), locale, instructionalLevel
- isPaid, price, priceAmount, priceCurrency (list price), salePrice, salePriceAmount, listPrice, listPriceAmount, discountPercent (integer), couponCode, discountEndsAt (RFC 3339 or null), discountPrice, discountPriceAmount (when on sale)
- avgRating, rating, numReviews, numSubscribers, numPublishedLectures, numQuizzes, numPracticeTests
- contentInfo, contentInfoShort, contentLengthVideo (seconds), estimatedContentLength (minutes)
- instructorId, instructorName, instructorTitle, instructorUrl, instructorImage
- instructorBio, instructorStudentsCount, instructorCoursesCount, instructorReviewsCount, instructorSocialLinks {website, linkedin, twitter, youtube, facebook, instagram, tiktok} (with includeInstructorProfiles)
- category, categoryUrl, subcategory, subcategoryUrl, topicLabel
- isBestseller, isHighlyRated, isNew, hasCertificate, hasClosedCaption
- objectives, prerequisites, requirements, targetAudiences, captionLanguages, curriculum (arrays of strings)
- reviews (array of {reviewId, reviewRating, reviewText, reviewDate, reviewerName, instructorReply, instructorReplyDate, instructorReplyBy}, with maxReviewsPerCourse)
- imageUrl, previewUrl, publishedTime, created, lastUpdateDate, scrapedAt, dataType ("course")
Dataset views: overview, reviews (one row per review), instructors.
Use apify-client for Python or JavaScript.

How to scrape Udemy courses

Get the top courses for a keyword

{
"searches": ["data analysis"],
"maxItems": 100
}

Each keyword returns the courses Udemy ranks first for it, with the full course page data.

Find the best beginner courses in French

{
"searches": ["excel"],
"languages": ["fr"],
"levels": ["beginner"],
"minRating": "4.5",
"maxItems": 50
}

The filters are applied by Udemy itself, so the 50 rows are 50 matching courses.

Collect reviews and instructor profiles for a topic

{
"startUrls": [{ "url": "https://www.udemy.com/topic/machine-learning/" }],
"maxItems": 30,
"maxReviewsPerCourse": 200,
"includeInstructorProfiles": true
}

Each course row carries its 200 newest written reviews and its instructor's bio, social links, students and courses. Open the Reviews view of the dataset to get one row per review.

Input parameters

ParameterTypeDefaultDescription
startUrlsarrayPython topicUdemy pages to read: topic, search, category, instructor or single course
searchesarraypython programmingKeywords, as typed in Udemy's search bar
maxItemsinteger50Total courses to collect across all links and keywords
languagesarrayallCourse languages, for example ["en", "fr"]
levelsarrayallall, beginner, intermediate, expert
minRatingstringnone4.5, 4.0, 3.5 or 3.0 stars and up
pricestringbothfree or paid
maxReviewsPerCourseinteger0Newest written reviews added to each course, 0 for none
includeInstructorProfilesbooleanfalseAdd the instructor's bio, social links, students, courses and reviews
debugModebooleanfalseShow detailed logs
LinkExampleWhat you get
Topichttps://www.udemy.com/topic/python/Every course of the topic, in Udemy's order, up to maxItems
Searchhttps://www.udemy.com/courses/search/?q=excel&lang=fr&ratings=4.5&sort=newestThe search results with the filters, sort and duration of the link
Instructorhttps://www.udemy.com/user/joseportilla/All public courses of the instructor, each with the instructor profile
Coursehttps://www.udemy.com/course/100-days-of-code/That course
Categoryhttps://www.udemy.com/courses/development/web-development/The courses Udemy's search ranks first for the category name

The language, level, rating and price filters of the form apply to every link and keyword. A filter written in a search link wins over the same filter in the form.

What data can you extract from Udemy?

Each course is one row with 57 fields, grouped as follows:

GroupFields
Identityid, title, url, headline, description, locale, instructionalLevel
PriceisPaid, price, priceAmount, priceCurrency, salePrice, salePriceAmount, listPrice, listPriceAmount, discountPercent, couponCode, discountEndsAt, discountPrice, discountPriceAmount
Audience and ratingsavgRating, rating, numReviews, numSubscribers
ContentnumPublishedLectures, numQuizzes, numPracticeTests, contentInfo, contentInfoShort, contentLengthVideo, estimatedContentLength, curriculum
InstructorinstructorId, instructorName, instructorTitle, instructorUrl, instructorImage
Classificationcategory, categoryUrl, subcategory, subcategoryUrl, topicLabel
BadgesisBestseller, isHighlyRated, isNew, hasCertificate, hasClosedCaption
Learningobjectives, prerequisites, requirements, targetAudiences, captionLanguages
Media and datesimageUrl, previewUrl, publishedTime, created, lastUpdateDate, scrapedAt, dataType

With includeInstructorProfiles, five more: instructorBio, instructorStudentsCount, instructorCoursesCount, instructorReviewsCount and instructorSocialLinks (website, linkedin, twitter, youtube, facebook, instagram, tiktok, only the ones the instructor shows).

With maxReviewsPerCourse, a reviews list: reviewId, reviewRating, reviewText, reviewDate and reviewerName, plus instructorReply, instructorReplyDate and instructorReplyBy when the instructor answered.

id is Udemy's course id and never changes; url is the permanent course page. Dates are RFC 3339 in UTC, except lastUpdateDate, a calendar day. discountEndsAt is null when the course is not on sale.

Output example

A real row from our test run (long lists and texts cut for reading):

{
"id": 5638250,
"title": "Python: The Professional Guide For Beginners (2026 Edition)",
"url": "https://www.udemy.com/course/professional-python-guide/",
"headline": "The professional Python guide for beginners in 2026",
"isPaid": true,
"price": "€19.99",
"priceAmount": 19.99,
"priceCurrency": "EUR",
"salePrice": "€19.99",
"salePriceAmount": 19.99,
"listPrice": "€19.99",
"listPriceAmount": 19.99,
"discountPercent": 0,
"couponCode": "KEEPLEARNING",
"discountEndsAt": null,
"avgRating": 4.66,
"numReviews": 1135,
"numSubscribers": 6908,
"numPublishedLectures": 135,
"numQuizzes": 6,
"contentInfo": "11.5 total hours",
"instructionalLevel": "Beginner Level",
"instructorId": 210013870,
"instructorName": "Federico Azzurro",
"instructorUrl": "https://www.udemy.com/user/federico-azzurro/",
"instructorTitle": "Programming Instructor",
"instructorBio": "Hello world! I’m Federico, but you might know me as Indently from YouTube where I teach to over 300K students...",
"instructorStudentsCount": 48262,
"instructorCoursesCount": 9,
"instructorReviewsCount": 8331,
"instructorSocialLinks": {
"website": "https://indently.io",
"youtube": "https://www.youtube.com/indently"
},
"imageUrl": "https://img-c.udemycdn.com/course/480x270/5638250_326b_6.jpg",
"publishedTime": "2024-03-08T06:36:12Z",
"lastUpdateDate": "2026-07-07",
"category": "IT & Software",
"subcategory": "Other IT & Software",
"hasCertificate": true,
"objectives": ["How to use PyCharm", "How to program in Python", "How to build projects"],
"captionLanguages": ["English [Auto]", "Romanian [Auto]"],
"locale": "English",
"curriculum": ["Introduction", "Python Basics", "Control & Flow"],
"reviews": [
{
"reviewId": 247316357,
"reviewRating": 5,
"reviewText": "Thanks for the great course. The author explains things very clearly and accessibly. I recommend it.",
"reviewDate": "2026-10-05T01:33:03Z",
"reviewerName": "Maksym R."
}
],
"scrapedAt": "2026-11-15T12:53:23Z",
"dataType": "course"
}

Advanced usage

Track a sale across a whole topic

{
"startUrls": [{ "url": "https://www.udemy.com/topic/excel/" }],
"price": "paid",
"maxItems": 500
}

Schedule it daily: discountPercent, salePrice and couponCode show when Udemy starts a sale, how deep it goes and when it ends (discountEndsAt).

Build an instructor lead list

{
"searches": ["digital marketing", "copywriting", "seo"],
"minRating": "4.5",
"includeInstructorProfiles": true,
"maxItems": 300
}

Open the Instructors view: name, headline, students, courses and the website, LinkedIn, YouTube and X links each instructor shows.

Audit a competitor's catalog

{
"startUrls": [{ "url": "https://www.udemy.com/user/joseportilla/" }],
"maxReviewsPerCourse": 100,
"maxItems": 100
}

All public courses of one instructor, with their prices, students, curriculum and the 100 newest reviews of each.

Mine reviews for sentiment analysis

{
"startUrls": [{ "url": "https://www.udemy.com/course/100-days-of-code/" }],
"maxReviewsPerCourse": 2000
}

The Reviews view exports one row per review (course, stars, text, date, reviewer, instructor reply) to CSV or Excel for your sentiment model.

Reuse a search from your browser

{
"startUrls": [{ "url": "https://www.udemy.com/courses/search/?q=react&instructional_level=intermediate&duration=long&sort=highest-rated" }],
"maxItems": 100
}

Set the filters on udemy.com, copy the address, paste it: the run keeps the keyword, level, duration and sort.

FAQ

What does each course row include? Title, headline, description, today's sale price, list price, discount percent, coupon code, sale end date, rating, reviews count, students, lectures, quizzes, practice tests, hours, level, language, instructor, category and subcategory, badges, learning objectives, requirements, target audience, captions and curriculum sections. Written reviews and the instructor profile are added when you ask for them.

Do I need a Udemy account? No. The scraper reads the public course pages, search, reviews and instructor pages. No login, no API key.

How many courses can one run collect? A topic, a keyword or a search link goes up to 10,000 courses each, as far as Udemy's search goes. Set maxItems to the total you want; 50 courses take about 3 minutes.

Why is discountPercent 0 on most rows? Udemy runs sales from time to time. Outside a sale, the price a visitor pays is the list price and discountPercent is 0. During a sale, salePrice, discountPercent, couponCode and discountEndsAt show the cut, the campaign and when it ends.

Which currency are prices in? The currency Udemy shows to the run's location: US dollars on Apify, euros from Europe. priceCurrency names it.

Can I filter by language, level, rating or price? Yes. The filters stack: languages: ["es"], levels: ["beginner"], minRating: "4.5" and price: "paid" return paid beginner courses in Spanish rated 4.5 stars or more.

Which reviews do I get? The newest written reviews first, up to maxReviewsPerCourse per course. Star ratings left without a comment are not included. Reviewer names are the short public form Udemy shows (first name and initial).

Can I scrape several topics or keywords in one run? Yes. Put several links in startUrls and several keywords in searches. A course found twice is saved once.

How fresh is the data? Live. Every run reads Udemy at run time, nothing is cached.

What is in an instructor profile? The bio, the headline, total students, courses and reviews across all their courses, and the website, LinkedIn, X, YouTube, Facebook, Instagram and TikTok links the instructor shows on Udemy. Links they did not fill in are left out.

Are image and course links permanent? Course and instructor URLs are permanent, and id never changes. Course images are hosted by Udemy and change when the instructor uploads a new one.

More SilentFlow scrapers

🛒 E-commerce

💼 Jobs

🏠 Real estate

📣 Social media

🏢 Business data

✈️ Travel

🎯 Lead generation

🔎 SEO

🎬 Video

📰 News

🧰 More tools