Udemy Scraper API
A Udemy scraper API that searches Udemy for a keyword and returns one flat row per course: title, instructors, rating, review count, enrolled students, today’s price beside the list price, duration, lecture count, level, language, category and URL. Read from Udemy’s own JSON API on the TLS tier — never a browser render.
$0.001 per delivered course · $2 free every month · Failed runs never billed
$ curl $QD/udemy_courses/run \
-H "Authorization: Bearer $QD_API_KEY" \
-d '{"keyword": "python", "max_results": 12}'
{ "status": "done", "count": 12,
"results": [
{
"course_id": …,
"title": "…",
"url": "…",
"headline": "…" } ],
"cost": 0.012 }
# 12 courses × $0.001 · nothing delivered, nothing charged
Try it
Udemy course search, running now
Change the input and run it against the live collector — nothing to install, no sign-up.
Run it from your own code, on your own inputs
Same collector, same rows — $2 of free API credit every month, no card.
What an Udemy scraper API does
Udemy’s search results page contains no courses on a plain fetch: its whole result area is one empty loader div whose arguments carry feature flags, and the topic pages are the same. The list API that would return a whole result page answers 403 to an anonymous client, and the discovery endpoint demands closed-enum parameters that live only in Udemy’s bundle. What remains open is the typeahead behind the search box — up to four matching courses plus related search phrases — and the per-course record, which is the only place every field lives together: rating, review count, subscribers, price and discount, duration, level, instructors.
So the collector reads those two. Because the typeahead returns at most four courses per phrase, beyond four results it widens the search using Udemy’s own related phrases and deduplicates by course id, and every row states the phrase that matched it. That shape is the source’s, not a preference, and the page says so rather than implying a full-text search that does not exist for anonymous clients.
Limits, in plain numbers
Everything that bounds one run of this collector. No hidden throttles.
Max per run
36 courses
Price
$0.001 / course
Per 1,000
$1.00
Failed runs
Free zero rows, zero charge
Free every month
$2 no card
Rate limit
60 req/min on the free tier
What one course looks like
Every delivered course carries these fields. Nullable means the source did not publish it — the field stays empty instead of being guessed.
| Field | Type | What it holds |
|---|---|---|
rank | integer | 1-based position in the delivered set. |
course_id | integer · nullable | Udemy's numeric course id — the stable de-duplication key. |
title | string · nullable | Course title. |
url | string · nullable | Course page URL. |
headline | string · nullable | Udemy's one-line course subtitle. |
instructor | string · nullable | First listed instructor. |
instructors | string[] | Every visible instructor, in Udemy's order. |
rating | number · nullable | Average rating out of 5, to 2 decimals. |
reviews | integer · nullable | Number of ratings the average is based on. |
students | integer · nullable | Enrolled students (num_subscribers). |
price | number · nullable | What a buyer pays right now — the campaign price while a Udemy deal is running, otherwise the list price. 0 for a free course. |
list_price | number · nullable | Undiscounted sticker price. |
currency | string · nullable | ISO currency of price/list_price (null on free courses, which state none). |
is_free | boolean | True when the course is free to enrol. |
discount_percent | integer · nullable | Percent off while a campaign is live; null when there is no discount. |
duration | string · nullable | Total content length as Udemy words it, e.g. "57 total hours". |
video_hours | number · nullable | Video runtime in hours. Measured from seconds of video, so it can read lower than duration, which also counts articles and resources. |
lectures | integer · nullable | Number of published lectures. |
level | string · nullable | Instructional level, e.g. "All Levels", "Beginner Level". |
language | string · nullable | Course language, e.g. "English". |
category | string · nullable | Primary Udemy category, e.g. "Development". |
subcategory | string · nullable | Primary Udemy subcategory, e.g. "Programming Languages". |
published_at | string · nullable | ISO 8601 timestamp of first publication. |
image | string · nullable | Course thumbnail URL (240x135). |
matched_phrase | string | The query that surfaced this course — your keyword, or one of Udemy's related search phrases when the result set was widened. |
Inputs
The whole request. Anything you leave out falls back to the default shown in the catalog.
| Input | Type | Required | What it does |
|---|---|---|---|
keyword | string | yes | What to search Udemy for — a topic, technology or skill. |
country | string | no | ISO 3166-1 alpha-2 code for the proxy exit — sets the pricing currency (default us). |
max_results | integer | no | How many courses to deliver at most (1–36). You pay only for delivered courses. |
Pricing
Udemy Scraper API pricing
$0.001 per delivered course. A run that delivers nothing costs nothing: blocked pages, challenges and retries are on us, and the $2 monthly allowance covers about 2,000 courses before you spend anything.
Pay as you go
- $2 free credit / month
- 60 requests / min
- List unit prices
Starter
- $15 free credit / month
- 300 requests / min
- 10% off unit prices
Growth
- $50 free credit / month
- 600 requests / min
- 20% off unit prices
Scale
- $250 free credit / month
- 1,200 requests / min
- 30% off unit prices
Same wallet, same key and same $2 monthly allowance as every other Data API. Prices are launch pricing read live from the billing config — GET /v1/scraper/collectors returns the price your key actually pays.
Integration
One POST, typed rows
Base URL https://api.quanticdata.io/v1, Bearer auth, the same key as every other Data API. Endpoint: POST /v1/.
curl -X POST https://api.quanticdata.io/v1/scraper/collectors/udemy_courses/run \
-H "Authorization: Bearer $QD_API_KEY" \
-H "Content-Type: application/json" \
-d '{"keyword":"python","max_results":12}'
What people build with the Udemy scraper API
Three shapes of work this endpoint was designed around.
Course pricing research
Today’s price next to the list price and the discount, per course, re-run to track Udemy’s constant sales.
Instructor and demand mapping
Students enrolled, rating and review count for the courses a keyword surfaces, with instructors named.
Content planning
Duration, lecture count and level for what already exists on a topic before producing your own.
Udemy Scraper API versus rolling your own
The differences that actually cost time when you build this in-house.
| DIY scraper | This collector | |
|---|---|---|
| Search page | Empty without a browser | Udemy’s typeahead plus the per-course record |
| Fields | Whatever a card shows | Rating, reviews, students, price and list price, duration, level, language |
| Breadth | Four results and stop | Widened through Udemy’s related phrases, deduplicated by id |
| Transparency | Unknown why a course appeared | matched_phrase on every row |
What people search for
Live autocomplete demand around Udemy course search, pulled with our own Keyword ideas collector.
Sources and standards
The platform documentation and standards this collector is built against — check any claim on this page against the primary source:
Why is max_results 36?
Each search phrase yields at most four courses from the typeahead, and the run widens across Udemy’s related phrases to reach more. Beyond a few dozen the phrases drift from your keyword, so the cap keeps rows relevant.
Does it show the discounted price?
Both: price is what a buyer pays today and list_price is the undiscounted figure, with discount_percent and is_free derived from Udemy’s own fields.
Is this Udemy’s official API?
It is Udemy’s own public JSON endpoints, read anonymously — the typeahead and the course record. The affiliate API requires an account and is not used.
Why does a row say which phrase matched it?
Because the run may have reached that course through a related phrase rather than your exact keyword, and you should be able to see that rather than trust it.
Is there a free Udemy scraper API?
Every account gets $2 of credit every month with no card, which is about 2,000 delivered courses on this endpoint at $0.001 each. It renews monthly, and a run that delivers nothing is never billed — so a failed or blocked attempt does not eat the allowance.
How much does one run cost?
Multiply the rows you actually receive by $0.001. A run capped at 36 courses — the maximum for this collector — costs $0.036 if every row comes back, and less when the source has fewer. Volume tiers take up to 30% off, and GET /v1/scraper/collectors returns the price your key actually pays.
Run the Udemy scraper API now
$2 of free credit every month, no card. Your key returns its own prices from GET /v1/scraper/collectors.