Udemy API: Search courses by topic
Searches Udemy courses on a topic and returns US visitor prices in USD, ratings, lecture counts and course details.
Unofficial. Not affiliated with or endorsed by Udemy.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Sort optional
sort Order of search results, for example most_reviewed.
most_relevant (default)
One of
most_relevant,most_reviewed,highest_rated,newest.- Level optional
level Course level to show, for example beginner; all includes every level.
expert
One of
all,beginner,intermediate,expert. Defaultall.- Topic, required
topic Topic or skill to search, for example Excel.
SQL
- Free Only optional
free_only Show only free courses, for example true.
false (default)
True or false.
- Max Results optional
max_results Maximum courses to return, for example 20.
60
Whole number from 1 to 60. Default
20.
Input as JSON
{ "level": "expert", "topic": "SQL", "max_results": 60}Output
{ "courses": [ { "level": "Expert", "title": "The Advanced SQL Server Masterclass For Data Analysis", "rating": 4.7, "headline": "Take your SQL skills - and your career - to the next level", "bestseller": false, "image_link": "https://img-c.udemycdn.com/course/240x135/4069268_523a_2.jpg" , "course_link": "https://www.udemy.com/course/advanced-sql-server-masterclass-for-data-analysis" , "instructors": [ "Travis Cuzick" ], "last_updated": "10/2026" , "current_price": { "amount": 18.99, "currency_code": "USD" }, "original_price": { "amount": 119.99, "currency_code": "USD" }, "number_of_ratings": 5996, "total_video_hours": 9, "number_of_lectures": 89 }, { "level": "Expert", "title": "Advanced SQL : The Ultimate Guide (2026)", "rating": 4.3, "headline": "Level Up Your Oracle SQL Knowledge From Intermediate to Advanced and Become an In-Demand Database SQL Expert in Oracle!", "bestseller": false, "image_link": "https://img-c.udemycdn.com/course/240x135/753174_8624_14.jpg" , "course_link": "https://www.udemy.com/course/sql-advanced" , "instructors": [ "Database Masters | 300,000+ Successful Students Worldwide", "Code Star Academy" ], "last_updated": "9/2026" , "current_price": { "amount": 19.99, "currency_code": "USD" }, "original_price": { "amount": 139.99, "currency_code": "USD" }, "number_of_ratings": 6540, "total_video_hours": 14, "number_of_lectures": 146 }, { "level": "Expert", "title": "SQL Advanced", "rating": 4.5, "headline": "Lead yourself to enhance your SQL skills and transform into Senior SQL Developer. Learn SQL by doing with me.", "bestseller": false, "image_link": "https://img-c.udemycdn.com/course/240x135/525156_62b1_3.jpg" , "course_link": "https://www.udemy.com/course/advanced-sql-tutorial" , "instructors": [ "Amarnath Reddy" ], "last_updated": "12/2018" , "current_price": { "amount": 12.99, "currency_code": "USD" }, "original_price": { "amount": 64.99, "currency_code": "USD" }, "number_of_ratings": 1533, "total_video_hours": 4.5, "number_of_lectures": 82 } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"udemy.com/search_courses","input":{"level":"expert","topic":"SQL","max_results":60}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "udemy.com/search_courses" , "input": { "level": "expert", "topic": "SQL", "max_results": 60 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "udemy.com/search_courses" , "input": { "level": "expert", "topic": "SQL", "max_results": 60 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run udemy.com/search_courses# with {"level":"expert","topic":"SQL","max_results":60}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "topic" ], "properties": { "sort": { "enum": [ "most_relevant", "most_reviewed", "highest_rated", "newest" ], "type": "string", "default": "most_relevant", "description": "Order of search results, for example most_reviewed." }, "level": { "enum": [ "all", "beginner", "intermediate", "expert" ], "type": "string", "default": "all", "description": "Course level to show, for example beginner; all includes every level." }, "topic": { "type": "string", "minLength": 1, "description": "Topic or skill to search, for example Excel." }, "free_only": { "type": "boolean", "default": false, "description": "Show only free courses, for example true." }, "max_results": { "type": "integer", "default": 20, "maximum": 60, "minimum": 1, "description": "Maximum courses to return, for example 20." } }, "additionalProperties": false}Output schema
{ "type": "object", "required": [ "courses" ], "properties": { "courses": { "type": "array", "items": { "type": "object", "required": [ "title", "headline", "instructors", "rating", "number_of_ratings", "total_video_hours", "number_of_lectures", "level", "current_price", "original_price", "bestseller", "last_updated", "image_link", "course_link" ], "properties": { "level": { "type": [ "string", "null" ] }, "title": { "type": "string" }, "rating": { "type": [ "number", "null" ] }, "headline": { "type": [ "string", "null" ] }, "bestseller": { "type": "boolean" }, "image_link": { "type": [ "string", "null" ] }, "course_link": { "type": "string" }, "instructors": { "type": "array", "items": { "type": "string" } }, "last_updated": { "type": [ "string", "null" ], "description": "Month and year as shown on the course page, for example 9/2026." }, "current_price": { "anyOf": [ { "type": "object", "required": [ "amount", "currency_code" ], "properties": { "amount": { "type": "number" }, "currency_code": { "type": "string" } }, "additionalProperties": false }, { "type": "null" } ] }, "original_price": { "anyOf": [ { "type": "object", "required": [ "amount", "currency_code" ], "properties": { "amount": { "type": "number" }, "currency_code": { "type": "string" } }, "additionalProperties": false }, { "type": "null" } ] }, "number_of_ratings": { "type": "integer" }, "total_video_hours": { "type": [ "number", "null" ] }, "number_of_lectures": { "type": [ "integer", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
udemy.com/search_courses- Returns
- title, headline, instructors, rating, number of ratings, video hours, lectures, level, current and original price, bestseller flag, last updated, image and course link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method udemy.com/search_courses with the inputs above.
Ask your agent
- Find me the top rated beginner Excel courses on Udemy with video hours and prices in USD
- I need a list of free Python courses sorted by most reviewed, showing lecture counts
- Show intermediate-level graphic design courses ordered by newest, including bestseller flags
- Which expert machine learning courses have the highest ratings and how many ratings do they have?
- Give me up to 10 beginner guitar courses with current and original prices and links
See more
Finds Coursera courses, specializations, professional certificates, degrees and guided projects on a topic, in Coursera's search order.
coursera.org/search_coursesFinds free MIT OpenCourseWare courses matching a topic, in relevance order, optionally limited to a course level or courses with lecture videos.
ocw.mit.edu/search_coursesLooks up a Coursera course, specialization or professional certificate by name or link and returns its providers, instructors, rating, enrollment, modules, skills, languages and publicly shown price.
coursera.org/get_courseFinds upcoming public Meetup events by topic and city, sorted by start time. Only events that mention the topic are included; external costs and undisclosed venues may not be shown.
meetup.com/search_eventsSearches Ulta Beauty products by keyword, brand, USD price range and sort order, and returns each product with its starting prices.
ulta.com/search_productsFinds OfferUp items for sale near a US city or ZIP code, with prices, condition, seller names, distance and links. Distances use approximate listing locations.
offerup.com/search_listingsLists public Medium articles for a topic, newest first or popular this week, with author, publication, reading time, claps and membership status.
medium.com/list_topic_articlesFinds public Substack newsletters matching a topic, in Substack's search order. Subscriber counts are null when Substack does not display one.
substack.com/search_newsletters