Udemy APIudemy.com ↗
Search Udemy's course catalog by keyword. Get course titles, URLs, pricing, instructor names, ratings, and pagination metadata via a single API endpoint.
What is the Udemy API?
The Udemy API exposes 1 endpoint — search_courses — that queries Udemy's full course catalog and returns up to 9 response fields per course, including title, URL, current and list prices, instructor names, ratings, and review counts. Each call returns a paginated result set of up to 20 courses along with total result and page counts, making it straightforward to traverse large result sets programmatically.
curl -X GET 'https://api.parse.bot/scraper/f132e70d-59c6-454e-9850-2c099802235b/search_courses?query=python' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace udemy-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Udemy course search — bounded, re-runnable."""
from parse_apis.udemy_com_api import Udemy, InputFormatInvalid
client = Udemy()
# Search for courses on a topic, capped at 5 total results.
for course in client.courses.search(query="machine learning", limit=5):
print(course.title, f"⭐ {course.rating}", course.current_price)
# Drill into the first result of a different search.
try:
top_course = client.courses.search(query="python", limit=1).first()
except InputFormatInvalid as e:
print(f"Invalid search input: {e.message}")
top_course = None
if top_course is not None:
print(top_course.title)
print(top_course.headline)
print(f"Instructors: {', '.join(top_course.instructors)}")
print(f"Price: {top_course.current_price} (was {top_course.list_price})")
print(f"Rating: {top_course.rating} ({top_course.num_ratings} ratings)")
print(top_course.url)
print("exercised: courses.search")
Search Udemy courses by keyword. Returns paginated results with course titles, URLs, current and list prices, instructor names, and ratings. Each page contains up to 20 courses. Pagination is controlled by the page parameter; omitting it returns page 1.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-indexed, max 500). |
| queryrequired | string | Search keyword or phrase (e.g. 'python', 'machine learning'). |
{
"type": "object",
"fields": {
"page": "integer current page number",
"courses": "array of course objects with id, title, url, headline, instructors, rating, num_ratings, current_price, list_price",
"total_pages": "integer total number of available pages",
"total_results": "integer total number of matching courses"
},
"sample": {
"data": {
"page": 1,
"courses": [
{
"id": "2776760",
"url": "https://www.udemy.com/course/100-days-of-code",
"title": "100 Days of Code™: The Complete Python Pro Bootcamp",
"rating": 4.67,
"headline": "Master Python by building 100 projects in 100 days.",
"list_price": "$129.99",
"instructors": [
"Dr. Angela Yu, Developer and Lead Instructor"
],
"num_ratings": 434164,
"current_price": "$13.99"
}
],
"total_pages": 500,
"total_results": 10000
},
"status": "success"
}
}About the Udemy API
What the API returns
The search_courses endpoint accepts a required query string and an optional page integer (1-indexed, up to page 500). Each response includes a courses array where every course object carries: id, title, url, headline, instructors (an array of instructor names), rating, num_ratings, current_price, and list_price. The current_price and list_price fields together let you calculate discount amounts and percentages directly from the response.
Pagination and result scope
The response envelope includes page (the current page number), total_pages, and total_results. Each page contains up to 20 courses, and you can request up to page 500, giving access to as many as 10,000 results per query. The total_results field reflects Udemy's ranking and filtering logic for the given keyword, so the same term queried at different times may return different counts as the catalog changes.
Practical notes
The headline field returns the short subtitle that appears under a course title on Udemy — useful for topic classification or duplicate detection when the title alone is ambiguous. The url field returns the canonical course path, which can be combined with the https://www.udemy.com base to construct a direct link. Ratings are floating-point values and num_ratings is an integer count, so you can sort or threshold results client-side without additional lookups.
The Udemy API is a managed, monitored endpoint for udemy.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when udemy.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official udemy.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a course comparison tool that surfaces current_price vs list_price discounts across a keyword search
- Aggregate instructor names from search results to identify which educators dominate a given topic
- Monitor total_results over time for a keyword to track growth or decline in a subject area on Udemy
- Populate an affiliate site with live course titles, URLs, and pricing pulled from paginated search_courses calls
- Filter courses by rating threshold to surface only highly-rated options for a curated learning path tool
- Index Udemy course headlines and titles for a semantic search or recommendation engine
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Udemy have an official developer API?+
What does the search_courses endpoint return beyond basic course info?+
id, title, url, headline, instructors (array), rating, num_ratings, current_price, and list_price. The envelope adds page, total_pages, and total_results for pagination. There is no per-course curriculum breakdown, lecture count, or enrollment count in the response.Are course reviews or individual student review text available?+
rating and num_ratings per course but does not expose individual review text, reviewer profiles, or review dates. You can fork this API on Parse and revise it to add a course reviews endpoint if that data is needed.Can I retrieve a specific course by its ID or URL rather than by keyword search?+
search_courses endpoint accepts a keyword query and returns matching results; there is no lookup-by-ID or lookup-by-URL endpoint. You can fork this API on Parse and revise it to add a course detail endpoint that accepts a course ID or slug.How deep can pagination go, and are there gaps in coverage for large result sets?+
page parameter accepts values from 1 to 500, and each page returns up to 20 results, so at most 10,000 results are accessible per query. Udemy's own ranking logic determines which courses appear and in what order; courses beyond the 10,000-result boundary for a broad query will not be reachable by incrementing the page parameter alone.