Udemy API

Course data including the price it is actually selling at

The Udemy API returns online-course data as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Udemy endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
U
/udemy/v1

7 active endpoints, on 1 and 2 credit tiers.

  • POST/udemy/v1/search
  • POST/udemy/v1/detail
  • POST/udemy/v1/pricing
  • POST/udemy/v1/reviews
  • POST/udemy/v1/curriculum
  • POST/udemy/v1/by_instructor
  • POST/udemy/v1/categories

What Udemy endpoints does ReefAPI ship?

7 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

7 endpoints

search

2 cr

Search Udemy courses by keyword (any topic, e.g.

required
query
optional
page, page_size

detail

1 cr

Full course card for a Udemy course by URL, slug or id.

required
optional
course_id, slug, url

pricing

1 cr

Live price, list price and discount price for one or many Udemy courses by id (comma-separated).

required
course_ids
optional

reviews

1 cr

Paginated public student reviews for a course by id.

required
course_id
optional
page, page_size

curriculum

1 cr

The course outline by id.

required
course_id
optional
page, page_size

by_instructor

1 cr

Browse every course published by a Udemy instructor, by their numeric instructor id.

required
instructor_id
optional
page, page_size

categories

1 cr

The live Udemy category taxonomy (Development, Business, IT & Software, Design, …) with ids,…

required
optional
category_id

Every parameter, every allowed value →

Udemy API

3 of 7 endpoints, ready to run

View docs ↗

Courses matching a query with the title, headline, rating, review count, lecture count, instructor and image.

2 credits1 required · 2 optional
POST/udemy/v1/search
ok1199 ms · 12 records · sample
{
  "ok": true,
  "meta": {
    "api": "udemy",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1198.6,
    "record_count": 12,
    "cache_hit": false
  },
  "data": {
    "results": [
      {
        "course_id": "2776760",
        "title": "100 Days of Code™: The Complete Python Pro Bootcamp",
        "headline": "Master Python by building 100 projects in 100 days. Learn data science, automation, build websites, games and apps!",
        "url": "https://www.udemy.com/course/100-days-of-code",
        "image": "https://img-c.udemycdn.com/course/480x270/2776760_f176_10.jpg",
        "rating": 4.67,
        "num_reviews": 434467,
        "num_lectures": 604,
        "instructional_level": "ALL_LEVELS",
        "video_length": "56h 48m",
        "locale": "en-US",
        "is_free": false,
        "instructors": [
          {
            "id": "31334738",
            "name": "Dr. Angela Yu, Developer and Lead Instructor"
          }
        ]
      },
      {
        "course_id": "567828",
        "title": "The Complete Python Bootcamp From Zero to Hero in Python",
        "headline": "Learn Python like a Professional  Start from the basics and go all the way to creating your own applications and games",
        "url": "https://www.udemy.com/course/complete-python-bootcamp",
        "image": "https://img-c.udemycdn.com/course/480x270/567828_67d0.jpg",
        "rating": 4.56,
        "num_reviews": 565760,
        "num_lectures": 170,
        "instructional_level": "ALL_LEVELS",
        "video_length": "22h 23m",
        "locale": "en-US",
        "is_free": false,
        "instructors": [
          {
            "id": "9685726",
            "name": "Jose Portilla"
          },
          {
            "id": "265589972",
            "name": "Pierian Training"
          }
        ]
      },
      {
        "course_id": "6413585",
        "title": "Complete 2026 Python Bootcamp: Learn Python from Scratch",
        "headline": "Master Python Programming from Scratch: Build Real-World Projects and Become Job-Ready in 2026",
        "url": "https://www.udemy.com/course/codewithharry-python",
        "image": "https://img-c.udemycdn.com/course/480x270/6413585_ec1f_2.jpg",
        "rating": 4.58,
        "num_reviews": 17501,
        "num_lectures": 110,
        "instructional_level": "BEGINNER",
        "video_length": "17h 43m",
        "locale": "en-US",
        "is_free": false,
        "instructors": [
          {
            "id": "239666752",
            "name": "Haris Ali Khan"
          }
        ]
      }
    ]
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Udemy API works

Udemy is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /udemy/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Tracking a course price that changes every week

This marketplace runs near-permanent discounts, so the list price is fiction and the current price is the only real number. It also moves constantly.

01search
POST/udemy/v1/search
{"query": "python"}

Establishes the shortlist with ratings and review counts — one course we measured carried over four hundred thousand reviews.

02pricing
POST/udemy/v1/pricing
{"course_ids": "567828,6873227"}

Then price several courses in one call rather than one per course, which is what makes a repeated price check affordable.

Pricing is a separate endpoint precisely because it is the volatile part — cache the catalogue, poll the price.

request
curl -X POST https://api.reefapi.com/udemy/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"python"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "udemy",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

The same Udemy course, three actions, three answers

search, detail and the pricing and curriculum actions each read a different Udemy surface, so one field name can hold three values for one course. Every number below is course 567828, The Complete Python Bootcamp, pulled on 2026-08-27 within a few minutes of itself. Pick the column that matches the question you are answering rather than assuming the actions agree.

Fieldsearchdetailpricing / curriculum
course_idString "567828"Integer 567828String "567828" in pricing
priceNot returned; only is_free falseprice.amount 104.99, is_paid trueprice.amount 12.99, list_price.amount 104.99, discount_price.amount 13.0
rating4.564.57Not returned
num_lectures170270curriculum meta.item_count 220, chapters and lectures combined
Durationvideo_length "22h 23m"video_length 79800 seconds, plus content_info "22.5 total hours"Not returned
instructional_levelALL_LEVELS, BEGINNER, INTERMEDIATE"All Levels", "Beginner Level"Not returned
locale"en-US""English (US)"Not returned
Review countnum_reviews 565638num_reviews 565638reviews meta.review_count 10000, a ceiling rather than a count
Result totalmeta.total_count 10000 for "python", 3932 for "kubernetes"Not applicableby_instructor meta.course_count 87 for instructor 9685726

Prices came back in EUR on every detail, pricing and by_instructor call and there is no currency parameter, so do not assume USD. discount_price is the rounded display figure (13.0 against a real price of 12.99); price.amount is the number to bill against.

What is stable here and what is not

Measured across searches and pricing lookups.

Pricing is its own endpoint, and it takes a list

Course metadata barely changes; the price changes weekly and sometimes daily. Splitting them means you can cache one and poll the other, and the batch shape means a watchlist costs one call rather than one per course.

Review counts here are enormous, which changes what a rating means

Individual courses carry hundreds of thousands of reviews. At that volume the average is stable and the differences between a 4.5 and a 4.7 are real, unlike on catalogues where a rating rests on a few dozen opinions.

Lecture count is the proxy for size

Rows carry how many lectures a course contains, which is the cheapest available signal for whether a course is an afternoon or a term. Duration is not consistently published; lecture count is.

The instructor is the brand

Unlike the university platforms, the seller here is a person. The instructor is on the row, and there is an endpoint to list everything one instructor publishes, which is how buyers on this platform actually navigate.

Against us: the list price is not a real price

This marketplace advertises a high list price against a near-permanent discount. Treat the current price as the price and ignore the discount percentage — computing savings against a reference nobody pays produces a number that flatters the seller, which is not what we are here for.

What people build with Udemy

The jobs this data is most often used for.

7

endpoints

1/2

credits per call

01

Course-aggregators call search to list Udemy courses by subject and rating.

02

Learning apps use detail and curriculum to show what a course covers.

03

Price tools use pricing to track course discounts over time.

What Udemy data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 184 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/udemy/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"python"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/udemy/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "python"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Udemy.

Get a free key →
Is course.price from the detail action what a student actually pays?

No, it is the list price. Course 567828 returned price.amount 104.99 from detail and price.amount 12.99 from the pricing action at the same moment, with pricing also reporting list_price.amount 104.99. The same pattern held for course 6873227: detail said 19.99, pricing said 9.99. If you are tracking real prices, call pricing, which accepts up to 50 comma-separated course ids in one request.

Why do search, detail and curriculum disagree on the number of lectures?

They count different things from different endpoints. For course 567828, search returned num_lectures 170, detail returned 270, and curriculum reported meta.item_count 220 because it counts chapters and lectures together in one flat list. None of them is corrupt; they are three of Udemy's own numbers. If you need a defensible figure, page the curriculum and count the rows where type equals "lecture".

What unit is video_length in?

It depends on the action. detail returns video_length as an integer count of seconds, 79800 for course 567828 and 23948 for course 6873227, and puts a human string in content_info ("22.5 total hours", "6.5 total hours"). search returns video_length already formatted as "22h 23m". They do not agree exactly, since 79800 seconds is 22h 10m. Use the seconds figure for arithmetic and the strings for display.

What are the valid instructional_level values?

Two vocabularies for the same idea. search returns screaming-snake constants, and a 24-result kubernetes page returned ALL_LEVELS, BEGINNER and INTERMEDIATE. detail and by_instructor return the display label instead: "All Levels", "Beginner Level". Normalize before you filter, or you will silently drop matches when you join a search row to a detail record.

Why is the review content empty?

Most Udemy students leave a star rating without writing anything, and the API returns those rows with content set to an empty string rather than skipping them. The first page of reviews for course 567828 returned three rows with real authors, ratings of 4.5 and 5.0, and empty content. Ratings can be half-stars. Each row also carries created and modified as ISO timestamps with a -07:00 offset, and instructor_reply, which was null on all three.

Is meta.total_count the real number of matching courses?

Only when it is under 10000. Searching "python" returned total_count 10000, which is Udemy's ceiling rather than a count, while "kubernetes" returned 3932, which is a real figure. Page size is capped at 24. Page until meta.has_more is false rather than computing a page count from total_count when the value is exactly 10000. The reviews action has the same 10000 ceiling on meta.review_count for a course with 565,638 reviews.

How do I get every course by one instructor?

Take instructors[].id from any detail or search result and pass it to by_instructor. Course 567828 lists Jose Portilla as id 9685726 and Pierian Training as 265589972; by_instructor on 9685726 returned meta.course_count 87. Those rows carry price (again the list price), rating, num_subscribers and content_info, but not locale or video_length, so follow up with detail when you need those.

What is in the categories action?

Thirteen top-level categories with numeric ids, and subcategories when you drill in. The top level is Development 288, Business 268, Finance & Accounting 328, IT & Software 294, Office Productivity 292, Personal Development 296, Design 269, Marketing 290, Lifestyle 274, Photography & Video 273, Health & Fitness 276, Music 278 and Teaching & Academics 300. Passing category_id 288 returns its subcategories, including Web Development 8, Data Science 558, Mobile Development 10 and Programming Languages 12, which is the value detail reports as subcategory.

What is the Udemy API?

Udemy API is a ReefAPI endpoint group for udemy It returns live JSON through POST requests under /udemy/v1.

Is the Udemy API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Udemy calls use the same shared credit balance as every other ReefAPI engine.

Do I need an Udemy login or account?

No login to Udemy is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Udemy data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Udemy API use?

Udemy actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Udemy from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call udemy actions with the same key, credit pool and JSON envelope used by normal REST requests.

25 Media, Film & Knowledge APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Udemy, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.