DEV Community

Cover image for LinkedIn Learning API: How to Get Course Data, Reviews, and Syllabus in 2026
Truffle Pig Data
Truffle Pig Data

Posted on

LinkedIn Learning API: How to Get Course Data, Reviews, and Syllabus in 2026

I keep hitting the same wall on learning-data projects: the catalog I want sits on LinkedIn Learning, and no open endpoint returns it. The official LinkedIn Learning API needs the Partner Program or a purchased site license with admin-provisioned OAuth. So I built a hosted LinkedIn Learning API that reads the public, logged-out course pages and returns each course as JSON: ratings, reviews, instructors, and syllabus.

Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.

Does LinkedIn Learning have a public API?

Sort of, and the distinction matters. Both official APIs, the Learning API and the Learning Reporting API, sit behind the Partner Program or a paid site license and return learner activity for seats you own, not the public catalog most people want.

Here, a LinkedIn Learning API means a service you call with a keyword or a course URL and get that public catalog metadata back as JSON, no login. It reads only public pages, not private learner activity; for that, use LinkedIn's Reporting API.

Official LinkedIn Learning API This route (public guest pages)
Access Partner Program or site license, admin OAuth None; reads public logged-out pages
Fields Learner activity, completions, admin reporting Catalog metadata: ratingValue, reviews, tableOfContents, instructors, skills
Price Enterprise contract Pay per row: $0.10 per 1,000 search rows, $0.50 per 1,000 full records

What the LinkedIn Learning API returns

In one sentence: it reads LinkedIn Learning's public logged-out course pages as JSON, from ratings and written reviews to the full lesson-by-lesson syllabus, with no login. Search mode returns one row per course; details mode returns the full record for a course, lesson, or path URL. The fields worth pulling:

Field Example Notes
ratingValue 4.7 Average learner rating out of 5, with ratingCount alongside.
reviews [{rating, body, authorName, authorJobTitle, authorProfileUrl, datePublished}] Written review text plus reviewer identity, not just a star average.
tableOfContents [{section, items:[{title, description, durationSeconds, isFree}]}] Full syllabus: every lesson has a description and an isFree flag, plus freeLessonCount.
instructors [{name, jobTitle, profileUrl}] Structured people with profile links. Full records add hasCertificate and skills.

Who this is for

  • Learning and development teams benchmarking an internal library against ratings and learner counts.
  • Course-recommender and AI-agent builders who need structured records, syllabus included.
  • Analysts reading the written reviews across a topic, or anyone wanting an online courses dataset without an enterprise contract.

The manual way, and where it breaks

It works, up to a point. A guest page like linkedin.com/learning/search?keywords=python loads courses without an account, and each course page embeds a schema.org Course block as JSON-LD:

import json, re, requests

url = "https://www.linkedin.com/learning/python-essential-training-18764650"
html = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}).text

for block in re.findall(r'<script type="application/ld\+json">(.*?)</script>', html, re.S):
    data = json.loads(block)
    if data.get("@type") == "Course":
        print(data["name"], data.get("aggregateRating", {}).get("ratingValue"))
Enter fullscreen mode Exit fullscreen mode

That gets a name and a star average, not the per-lesson isFree flags, reviewer names, or the courses in a learning path. Those sit elsewhere and shift often, so selectors rot. Logged out, LinkedIn serves at most 50 results per query, so a real catalog means merging many queries.

The faster way: run the LinkedIn Learning API

Three ways to call it.

Apify Console

  1. Open the LinkedIn Learning API and click Try for free.
  2. Leave Mode on Search, type a keyword such as python, and narrow by level, length, or software.
  3. Click Start and export the dataset as JSON, CSV, or Excel.

REST API

One call runs the Actor and returns the dataset in the same response:

curl -X POST "https://api.apify.com/v2/acts/johnvc~linkedin-learning-api/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "mode": "search", "queries": ["project management"], "maxItems": 25 }'
Enter fullscreen mode Exit fullscreen mode

Full run-endpoint documentation is in the Apify API docs.

MCP

Point any MCP client at the hosted Apify server and the Actor becomes a tool:

https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-learning-api
Enter fullscreen mode Exit fullscreen mode

In Claude, Claude Code, or Cursor, ask it to search the catalog mid-conversation, a LinkedIn Learning MCP server with no glue code.

Get LinkedIn Learning course data in Python

The apify-client package mirrors the REST API. With enrichDetails on, the run mixes row types, so filter to course_detail before reading ratingValue:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("johnvc/linkedin-learning-api").call(run_input={
    "mode": "search",
    "queries": ["python"],
    "maxItems": 5,
    "enrichDetails": True,
    "maxConcurrency": 5,
})

for row in client.dataset(run.default_dataset_id).iterate_items():
    if row.get("resultType") != "course_detail":
        continue
    print(row["title"], row.get("ratingValue"), row.get("ratingCount"), row["courseUrl"])
Enter fullscreen mode Exit fullscreen mode

Get the LinkedIn Learning course catalog as JSON

Search mode with one query is the fastest way to a clean catalog. The LinkedIn Learning course data as JSON task returns one row per course with title, courseUrl, instructors, and difficultyLevel:

{ "mode": "search", "queries": ["project management"], "maxItems": 25 }
Enter fullscreen mode Exit fullscreen mode

Pull a LinkedIn Learning course list with no login

Same pattern, a different topic, no account or cookie. The LinkedIn Learning course data without a login task reads the public catalog for a term like cybersecurity:

{ "mode": "search", "queries": ["cybersecurity"], "maxItems": 25 }
Enter fullscreen mode Exit fullscreen mode

Run a LinkedIn Learning course catalog download

A single query caps at 50. expandWithFilters re-runs it across filter combinations and merges unique courses, the only way past that ceiling; enrichDetails adds rating and enrollment. The LinkedIn Learning course ratings dataset task shows the enriched shape:

{ "mode": "search", "queries": ["python"], "maxItems": 5, "enrichDetails": true, "maxConcurrency": 5 }
Enter fullscreen mode Exit fullscreen mode

Enriched rows bill at the detail rate, never both.

Extract LinkedIn Learning reviews and ratings

The written review body with reviewer identity is the field no competing course scraper exposes. In details mode each row carries ratingValue, ratingCount, and a reviews array. The extract LinkedIn Learning course reviews task reads three courses at once:

{ "mode": "details", "courseUrls": ["https://www.linkedin.com/learning/python-essential-training-18764650", "https://www.linkedin.com/learning/agile-foundations", "https://www.linkedin.com/learning/sql-essential-training-3"] }
Enter fullscreen mode Exit fullscreen mode

Find free preview lessons in a course

Every lesson in tableOfContents carries an isFree flag and freeLessonCount totals them, so you can rank courses by how much is watchable free and surface LinkedIn Learning free courses. The free preview lessons task returns the full syllabus with that flag on every lesson:

{ "mode": "details", "courseUrls": ["https://www.linkedin.com/learning/python-essential-training-18764650", "https://www.linkedin.com/learning/excel-essential-training-microsoft-365", "https://www.linkedin.com/learning/communication-foundations-2018"] }
Enter fullscreen mode Exit fullscreen mode

Scrape LinkedIn Learning Excel course data

The softwareNames filter keeps only courses that teach a specific tool, using LinkedIn's own label. LinkedIn applies only the first label per run, so run each tool separately. The Excel course data task keeps courses that teach Microsoft Excel:

{ "mode": "search", "queries": ["excel"], "softwareNames": ["Microsoft Excel"], "maxItems": 25 }
Enter fullscreen mode Exit fullscreen mode

Scrape LinkedIn Learning Figma course data

The same softwareNames pattern works for a design tool. The Figma course data task keeps only courses that teach Figma:

{ "mode": "search", "queries": ["figma"], "softwareNames": ["Figma"], "maxItems": 25 }
Enter fullscreen mode Exit fullscreen mode

Map skills taught across the LinkedIn Learning catalog

An enriched search returns a skills array on every course, each linked to its topic page. The skills coverage task shows which skills a topic teaches:

{ "mode": "search", "queries": ["data analysis"], "maxItems": 5, "enrichDetails": true, "maxConcurrency": 5 }
Enter fullscreen mode Exit fullscreen mode

Get LinkedIn Learning instructors and profile links

Enriched rows also return instructors with name, job title, and profile link. The instructor data task adds the course rating, level, and duration:

{ "mode": "search", "queries": ["leadership"], "maxItems": 5, "enrichDetails": true, "maxConcurrency": 5 }
Enter fullscreen mode Exit fullscreen mode

Track new course releases and learning paths

Set sortBy to RECENCY and each run returns the newest courses first, so a scheduled run watches a subject for releases. The track new courses task uses:

{ "mode": "search", "queries": ["artificial intelligence"], "sortBy": "RECENCY", "maxItems": 25 }
Enter fullscreen mode Exit fullscreen mode

For learning paths, set entityType to LEARNING_PATH or pass a /learning/paths/ URL; each path row carries pathUrl and its ordered member courses, with courseCount.

The example repo

GitHub logo johnisanerd / Apify-LinkedIn-Learning-API

LinkedIn Learning API: Python + MCP quick-start on Apify. Call it from Python (uv) or as an MCP tool in Claude and Cursor. Returns structured JSON for course data, learner reviews, syllabus and instructors, no login needed.

🎓 LinkedIn Learning API: Course Data, Reviews and Syllabus from Python and MCP

A Python and MCP quick-start for the LinkedIn Learning API on Apify. Search the public LinkedIn Learning course catalog by keyword, skill level, length or software, then pull the full record for any course: rating and rating count, written learner reviews, the complete syllabus with a description and a free-preview flag on every lesson, instructors with profile links, skills taught and certificate details. None of it needs a login, a cookie or a site license.

LinkedIn's own Learning API is available only through its Partner Program or a purchased site license, with OAuth keys an admin has to provision. This Actor reads the pages LinkedIn Learning already publishes to logged-out visitors and returns the same catalog metadata as JSON: course title…




The repo has a runnable Python quick start, a .env template, and the MCP server URL.

FAQ about scraping LinkedIn Learning

Does the LinkedIn Learning scraper show which courses give a certificate?

Yes, through hasCertificate and certificateName on every full record. It is a certificate of completion, not an accredited qualification.

Are LinkedIn Learning courses free, and what does the scraper cost?

Most need a subscription, but freeLessonCount and the per-lesson isFree flag show what is watchable free. Billing is pay per row: $0.10 per 1,000 courses found and $0.50 per 1,000 full records; the detail charge replaces the search charge.

How do you get a list of LinkedIn Learning courses with this scraper?

Run search mode with keywords or topic pages, and turn on expandWithFilters to pass the 50-per-query ceiling: it re-runs the query across filter combinations and merges unique courses.

Can the scraper tell me whether every course in a topic gives a certificate?

Run an enriched search and read hasCertificate across the rows. Not every course carries one, so the flag is per course, not per topic.

What does the scraper return for a LinkedIn Learning learning path?

Pass a /learning/paths/ URL in details mode, or set entityType to LEARNING_PATH in search. The row carries pathUrl and the ordered member courses in courses, with courseCount.

How does the scraper tell a learning path apart from a course?

By the entityType value: COURSE is one multi-lesson unit, VIDEO is a single lesson, and LEARNING PATH is a curated sequence of courses.

How do I find the free preview lessons with the scraper?

Every lesson in tableOfContents carries an isFree flag and freeLessonCount totals them, so a result set sorts by how much is watchable without paying.

Can the scraper download the LinkedIn Learning course catalogue?

There is no official export. Run queries or topic pages with expandWithFilters, then export as CSV, JSON, or Excel. LinkedIn caps a query at 50, so a broad catalogue comes from many queries; approximateTotalResults is a size signal, not an exact count.

More from Truffle Pig Data

The same public-page approach runs across the LinkedIn family:

Wrapping up

The official API is gated, but the public catalog is not: pull ratings, reviews, and the syllabus as JSON with no login. Start from the LinkedIn Learning API and run your first search free, or clone the example repo.

Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.

Last Updated: 2026.09.02

Top comments (0)