# Udemy Scraper API — $0.001 per course

> Udemy Scraper API: Search Udemy by keyword — rating, reviews, students, price, duration. $0.001 per delivered course, nothing delivered means nothing charged.

[Home](https://quanticdata.io/)/[Collectors](https://quanticdata.io/collectors/)/*Udemy Scraper API*

# 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.

By [Aldo Morese](https://quanticdata.io/about/), founder of QuanticData · Published Aug 21, 2026 · Updated Sep 3, 2026

[Get my free API key](https://app.quanticdata.io/register) [See the request](/collectors/udemy-scraper-api/#integration)

$0.001 per delivered course · $2 free every month · Failed runs never billed

POST /v1/scraper/collectors/udemy_courses/run

```
$ 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
```

You send keyword and country; the run goes out through a residential exit and comes back as courses with rank, course_id and title — 25 fields on every row — and you are billed $0.001 for each course actually delivered, nothing for a run that delivers none.

**$0.001 / course**2,000 courses on the free $2 every month

**Semantic input**keyword, country, max_results — no URL lists

**Up to 36**courses per run, pagination handled for you

**No browser**read over HTTP/TLS — cheaper and faster than rendering

On this page: [Try it](/collectors/udemy-scraper-api/#try) [What it is](/collectors/udemy-scraper-api/#what) [Limits](/collectors/udemy-scraper-api/#caps) [Output fields](/collectors/udemy-scraper-api/#output) [Inputs](/collectors/udemy-scraper-api/#input) [Pricing](/collectors/udemy-scraper-api/#pricing) [Integration](/collectors/udemy-scraper-api/#integration) [Use cases](/collectors/udemy-scraper-api/#use-cases) [Versus the alternatives](/collectors/udemy-scraper-api/#compare) [FAQ](/collectors/udemy-scraper-api/#faq)

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.

[Get my free API key](https://app.quanticdata.io/register)

## 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.

Input is meaning, not a URL *keyword* *country* *max_results*

## 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.

**$0.001**per delivered course*$1 per 1,000 delivered courses*

**2,000 courses**on the free allowance*$2 every month, no card*

**Zero rows**zero charge*blocks, captchas and retries are on us*

**−30%**on volume tiers*the catalog returns your key's price*

### Pay as you go

$0/mo

- $2 free credit / month

- 60 requests / min

- List unit prices

### Starter

$19/mo

- $15 free credit / month

- 300 requests / min

- 10% off unit prices

Most popular

### Growth

$79/mo

- $50 free credit / month

- 600 requests / min

- 20% off unit prices

### Scale

$299/mo

- $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](https://quanticdata.io/web-data-api-for-ai/). 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/scraper/collectors/udemy_courses/run`.

```
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}'
```

```
import requests

r = requests.post(
    "https://api.quanticdata.io/v1/scraper/collectors/udemy_courses/run",
    headers={"Authorization": f"Bearer {QD_API_KEY}"},
    json={
        "keyword": "python",
        "max_results": 12
    },
    timeout=120,
)
for row in r.json()["payload"]["results"]:
    print(row)
```

```
const res = await fetch(
  "https://api.quanticdata.io/v1/scraper/collectors/udemy_courses/run",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.QD_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({"keyword":"python","max_results":12}),
  },
);
const { payload } = await res.json();
console.table(payload.results);
```

```
claude mcp add quanticdata \
  -e QUANTICDATA_API_KEY=qd_live_your_key_here \
  -- npx -y quanticdata-mcp

# then, in the chat:
> run the udemy_courses collector with keyword="python" and 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.

Searches: [udemy scraper github](/collectors/udemy-scraper-api/#try) [udemy courses scraper](/collectors/udemy-scraper-api/#try) [udemy course scraper github](/collectors/udemy-scraper-api/#try) [udemy coupon scraper](/collectors/udemy-scraper-api/#try)

The same call you would paste into a terminal: a Bearer key, keyword and country in the body, and back the envelope every QuanticData endpoint returns — type, message, payload — where count is how many courses arrived and usage.cost_usd is $0.012, which is 12 × $0.001. A run that delivers nothing costs nothing. The key is good for 60 req/min on the free tier.

## Sources and standards

The platform documentation and standards this collector is built against — check any claim on this page against the primary source:

- [Udemy: the Affiliate API documentation](https://www.udemy.com/developers/affiliate/)

- [Schema.org: the Course type](https://schema.org/Course)

## FAQ

Questions we get about the Udemy scraper API.

[Something else? Ask us →](mailto:hello@quanticdata.io)

### 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`.

[Get my free API key](https://app.quanticdata.io/register)

Related: [All 100 collectors](https://quanticdata.io/collectors/) [Coursera Scraper API](https://quanticdata.io/collectors/coursera-scraper-api/) [YouTube scraper API](https://quanticdata.io/collectors/youtube-scraper-api/) [Google search results API](https://quanticdata.io/collectors/google-search-results-api/) [Web data for AI](https://quanticdata.io/web-data-api-for-ai/) [Documentation](https://quanticdata.io/docs/)

## Also on this site

Quantic**Data**

Residential proxies & web data APIs for AI.

#### Proxies

- [Residential Basic](https://quanticdata.io/residential-proxies/#basic)

- [Residential Premium](https://quanticdata.io/residential-proxies/#plans)

- [Cheap Residential](https://quanticdata.io/cheap-residential-proxies/)

- [Mobile Proxies](https://quanticdata.io/mobile-proxies/)

- [Datacenter Proxies](https://quanticdata.io/datacenter-proxies/)

- [ISP Proxies](https://quanticdata.io/isp-proxies/)

- [Rotating Proxies](https://quanticdata.io/rotating-proxies/)

- [Sneaker Proxies](https://quanticdata.io/sneaker-proxies/)

- [SOCKS5 Proxies](https://quanticdata.io/socks5-proxies/)

- [IPv6 Proxies](https://quanticdata.io/ipv6-proxies/)

- [Proxy locations](https://quanticdata.io/proxies/)

#### Data APIs

- [MCP Server](https://quanticdata.io/mcp-server/)

- [Web Scraper API](https://quanticdata.io/web-scraping-api/)

- [SERP API](https://quanticdata.io/serp-api/)

- [Collectors](https://quanticdata.io/collectors/)

- [Web Data for AI](https://quanticdata.io/web-data-api-for-ai/)

- [Quantic AI](https://quanticdata.io/ai-web-scraping-service/)

- [Browser AI Agents](https://quanticdata.io/browser-ai/)

- [Crawl & Map](https://quanticdata.io/crawl-map/)

- [SEO Audit](https://quanticdata.io/seo-audit/)

#### Use cases

- [Company data](https://quanticdata.io/scrape-company-data/)

- [Price monitoring](https://quanticdata.io/competitor-price-monitoring/)

- [Market research](https://quanticdata.io/market-research-data/)

- [Real estate data](https://quanticdata.io/real-estate-data-scraping/)

- [Scrape job postings](https://quanticdata.io/scrape-job-postings/)

#### Company

- [Documentation](https://quanticdata.io/docs/)

- [Blog](https://quanticdata.io/blog/)

- [Free tools](https://quanticdata.io/tools/)

- [Partners](https://quanticdata.io/partners/)

- [About](https://quanticdata.io/about/)

- [Alternatives](https://quanticdata.io/alternatives/)

- [Pricing](https://quanticdata.io/pricing/)

- [FAQ](https://quanticdata.io/#faq)

- [For AI agents](https://quanticdata.io/#ai)

#### Free tools

- [All tools](https://quanticdata.io/tools/)

- [Website to Markdown](https://quanticdata.io/tools/website-to-markdown/)

- [PDF to Markdown](https://quanticdata.io/tools/pdf-to-markdown/)

- [WAF detector](https://quanticdata.io/tools/waf-detector/)

- [AI visibility audit](https://quanticdata.io/tools/ai-visibility-audit/)

- [AI crawler checker](https://quanticdata.io/tools/ai-crawler-checker/)

- [robots.txt tester](https://quanticdata.io/tools/robots-txt-tester/)

- [robots.txt generator](https://quanticdata.io/tools/robots-txt-generator/)

- [User agent](https://quanticdata.io/tools/user-agent/)

- [cURL converter](https://quanticdata.io/tools/curl-converter/)

- [Proxy tester](https://quanticdata.io/tools/proxy-tester/)

© 2026 QuanticData ·

- [quanticdata.io](https://quanticdata.io/)

·

- [Terms](https://quanticdata.io/terms/)

·

- [Privacy](https://quanticdata.io/privacy/)

If you are an AI agent:

- [llms.txt](https://quanticdata.io/llms.txt)

·

- [llms-full.txt](https://quanticdata.io/llms-full.txt)

---

Source: https://quanticdata.io/collectors/udemy-scraper-api/ · Site index for AI: https://quanticdata.io/llms.txt · Full dump: https://quanticdata.io/llms-full.txt
