# LinkedIn Learning Courses Scraper (`maximedupre/linkedin-learning-courses`) Actor

Collect public LinkedIn Learning courses, lessons, and learning paths. Get titles, skills, instructors, ratings, and available reviews and syllabus data to compare courses and plan training.

- **URL**: https://apify.com/maximedupre/linkedin-learning-courses.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Education, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 courses

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🎓 Find LinkedIn Learning courses for your training plan

LinkedIn Learning Courses Scraper helps training teams, course researchers, and developers collect public course, lesson, and learning-path data. Get titles, skills, instructors, ratings, and available reviews and syllabus details in one dataset to compare training options and plan what to learn.

- Compare ratings and skills with the **[Best LinkedIn Learning Courses](https://apify.com/maximedupre/linkedin-learning-courses/examples/best-linkedin-learning-courses)** example.
- Explore AI training with the **[LinkedIn Learning AI](https://apify.com/maximedupre/linkedin-learning-courses/examples/linkedin-learning-ai)** example.
- Read public completion details with the **[LinkedIn Learning Certificate](https://apify.com/maximedupre/linkedin-learning-courses/examples/linkedin-learning-certificate)** example.
- Review course options using the **[LinkedIn Courses with Certificates](https://apify.com/maximedupre/linkedin-learning-courses/examples/linkedin-courses-with-certificates)** example.
- Build a training list with the **[LinkedIn Learning Courses with Certificates](https://apify.com/maximedupre/linkedin-learning-courses/examples/linkedin-learning-courses-with-certificates)** example.

#### 📚 Course, lesson, and learning-path data

Courses can include descriptions, levels, skills, category paths, instructors, dates, ratings, learner counts, written reviews, and a public syllabus. Syllabus lessons can include preview and subscription flags. Courses can also include certificate details and learning-path links.

Lesson rows include public lesson details and a parent-course link. Learning-path rows include public path details and their member courses in source order. Optional details appear only when the source provides them. Empty arrays may appear for reviews, syllabus sections, or path members.

The Actor saves the first eligible match for each source item at once and continues discovery. Later matches for the same item are ignored. `discoveryInput` shows only the first keyword, topic, or listing URL that led to the saved row.

#### ▶️ Search the catalog or submit content links

1. Choose Courses, Lessons, or Learning paths as the result type.
2. Choose Keywords, Topics, Listing URLs, or Content URLs and fill in its fields. Only fields for that choice are used.
3. For discovery, set any level, length, software, release-date, and sort options you need. All submitted search terms share these filters.
4. Set Maximum results or leave it empty to return all available results until the source is exhausted.
5. Start the run and open the dataset through Output.

Content URLs collect each submitted page directly. You can mix course, lesson, and learning-path URLs in a batch of up to 200. Each page returns its own content type, and discovery filters do not apply.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `resultType` | string | Required. Choose `courses`, `lessons`, or `learningPaths` for discovery. Content URLs return the type of each submitted page. |
| `findBy` | string | Choose `keywords`, `topics`, `listingUrls`, or `contentUrls`. Only fields for that choice are used. Defaults to `keywords`. |
| `keywords` | array of strings | Search terms. All terms use the same discovery filters. |
| `topics` | array of strings | Topic slugs or public topic URLs, such as `python` or `https://www.linkedin.com/learning/topics/python`. |
| `listingUrls` | array of URL objects | Public LinkedIn Learning search or all-courses URLs. Put each link in a `url` field. |
| `contentUrls` | array of URL objects | Up to 200 public course, lesson, or learning-path URLs. Put each link in a `url` field. Types can be mixed; discovery filters do not apply. |
| `levels` | array of strings | Keep `beginner`, `intermediate`, or `advanced` discovery matches. Leave empty for all levels. |
| `duration` | string | Discovery length filter: `all`, `under10Minutes`, `10To30Minutes`, `30To60Minutes`, `1To2Hours`, `2To3Hours`, or `over3Hours`. Defaults to `all`. |
| `software` | string | Software name to use as a discovery filter, such as Excel. Leave empty for any tool. |
| `sort` | string | Source order for discovery: `relevance`, `popularity`, or `newest`. Defaults to `relevance`. |
| `releasedWithin` | string | Discovery release-date filter: `any`, `month`, or `year`. Defaults to `any`. |
| `maxItems` | integer | Stop after this many results across the run. Minimum 1, with no fixed upper bound. Leave empty to return all available results until the source is exhausted. |

The level, length, software, sort, and release-date filters apply to Keywords, Topics, and Listing URLs.

**Example input**

This is the public input from the successful default-input run on the current beta build:

```json
{
  "resultType": "courses",
  "findBy": "keywords",
  "keywords": [
    "Python"
  ],
  "duration": "all",
  "sort": "relevance",
  "releasedWithin": "any",
  "maxItems": 10
}
```

#### 🧾 Output

The `results` output is a string link to the collected data in the default Apify dataset. Each row is a course, lesson, or learning path. `contentType`, `id`, `title`, and `url` are required in all three shapes. Other fields appear when available. Source dates and length values stay in the form supplied by LinkedIn Learning.

**Course fields**

| Field | Type | What it does |
|---|---|---|
| `contentType` | string | The kind of public content in this row. |
| `id` | string | Source content ID for joining records and checking the source. |
| `title` | string | Content title. |
| `url` | string | Canonical public content page link. |
| `description` | string | Public content description. |
| `duration` | string | Content length as shown by the source. |
| `language` | string | Content language listed by the source. |
| `publishedAt` | string | Source publication date. |
| `imageUrl` | string | Content cover image link. |
| `instructors` | array of objects | Public instructors for this content. |
| `instructors[].name` | string | Instructor name. |
| `instructors[].professionalTitle` | string | Public job title or headline. |
| `instructors[].profileUrl` | string | Public instructor profile link. |
| `instructors[].photoUrl` | string | Instructor photo link. |
| `discoveryInput` | string | The first submitted keyword, topic, or listing URL that led to this saved row. |
| `approximateMatchCount` | integer | Approximate total matches reported by the source for that discovery input. |
| `level` | string | Course level listed by the source. |
| `skills` | array of strings | Skills taught by the course. |
| `categories` | array of string arrays | Course category paths listed by the source. |
| `learnerCount` | integer | Learner count reported by the source. |
| `viewerCount` | integer | Viewer count reported by the source. |
| `likedByCount` | integer | Liked-by count reported by the source. |
| `averageRating` | number | Average course rating reported by the source. |
| `ratingCount` | integer | Number of ratings reported by the source. |
| `reviews` | array of objects | Public written learner reviews. This may be empty. |
| `reviews[].text` | string | Review text. |
| `reviews[].rating` | number | Rating given by the reviewer. |
| `reviews[].authorName` | string | Reviewer name. |
| `reviews[].authorTitle` | string | Public reviewer job title or headline. |
| `reviews[].authorProfileUrl` | string | Public reviewer profile link. |
| `reviews[].publishedAt` | string | Review date as shown by the source. |
| `syllabus` | array of objects | Course sections in source order. This may be empty. |
| `syllabus[].title` | string | Section title. |
| `syllabus[].lessons` | array of objects | Lessons in source order. |
| `syllabus[].lessons[].title` | string | Lesson title. |
| `syllabus[].lessons[].description` | string | Public lesson description. |
| `syllabus[].lessons[].duration` | string | Lesson length as shown by the source. |
| `syllabus[].lessons[].url` | string | Public lesson page link. |
| `syllabus[].lessons[].isFreePreview` | boolean | Whether the source offers this lesson as a free preview. |
| `syllabus[].lessons[].requiresSubscription` | boolean | Whether the source says a subscription is needed for this lesson. |
| `certificates` | array of objects | Public completion-certificate details. |
| `certificates[].name` | string | Certificate name. |
| `certificates[].description` | string | Public certificate details. |
| `certificates[].url` | string | Public certificate information link. |
| `createdAt` | string | Course creation date reported by the source. |
| `lessonCount` | integer | Total lessons reported by the source. This may include lessons absent from the public syllabus. |
| `freePreviewCount` | integer | Total free-preview lessons reported by the source. This may include lessons absent from the public syllabus. |
| `accessModel` | string | Course access model listed by the source, such as subscription access. |
| `learningPaths` | array of objects | Learning paths that the source lists for this course. This may be empty. |
| `learningPaths[].title` | string | Learning path title. |
| `learningPaths[].url` | string | Public learning path page link. |

**Example course row**

This genuine Python course row is shortened. The JSON string `"..."` marks omitted reviews and syllabus sections. All other values are kept as returned. These examples come from successful runs on the current beta build.

```json
{
  "contentType": "course",
  "id": "python-essential-training-18764650",
  "title": "Python Essential Training",
  "url": "https://www.linkedin.com/learning/python-essential-training-18764650",
  "duration": "PT4H23M9S",
  "imageUrl": "https://media.licdn.com/dms/image/v2/D560DAQEruxcXLwzu_A/learning-public-crop_675_1200/B56Z1oT93iKkAY-/0/1775571558434?e=2147483647&v=beta&t=J1obbigq6mj2wpN2b9Fu7Zyt6mkPdO5-NlYw1yByIOU",
  "viewerCount": 654387,
  "publishedAt": "2023-01-25",
  "discoveryInput": "Python",
  "approximateMatchCount": 398,
  "description": "Get a comprehensive overview of the Python programming language and gain enough command of Python 3 to create well-designed scripts and maintain existing projects.",
  "language": "en",
  "instructors": [
    {
      "name": "Ryan Mitchell",
      "professionalTitle": "O'Reilly / Wiley Author | LinkedIn Learning Instructor | Principal Software Engineer @ GLG",
      "profileUrl": "https://www.linkedin.com/in/remitchell",
      "photoUrl": "https://media.licdn.com/dms/image/v2/C5603AQHi4kzL_mpFUQ/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1649094417238?e=2147483647&v=beta&t=oRk6DnpL3tJsl4O21gRLOriJuGSt40sVxDFa5Zxuwtk"
    }
  ],
  "createdAt": "2023-01-25",
  "lessonCount": 56,
  "freePreviewCount": 10,
  "accessModel": "Subscription",
  "learningPaths": [
    {
      "title": "OpenEDG Python Institute: Programming with Python Professional Certificate",
      "url": "https://www.linkedin.com/learning/paths/openedg-python-institute-programming-with-python-professional-certificate"
    }
  ],
  "level": "Beginner",
  "skills": [
    "Python (Programming Language)"
  ],
  "categories": [
    [
      "All topics",
      "Technology",
      "Software Development",
      "Programming Languages"
    ]
  ],
  "likedByCount": 18748,
  "learnerCount": 654387,
  "averageRating": 4.7,
  "ratingCount": 17613,
  "reviews": [
    {
      "text": "its good  experince",
      "rating": 5,
      "authorName": "Muskan Kumari",
      "authorTitle": "Student at Accurate Institute of Management, Greater Noida. India",
      "authorProfileUrl": "https://in.linkedin.com/in/muskan-kumari-aa8243435",
      "publishedAt": "2026-10-01T09:10:23.335Z"
    },
    "..."
  ],
  "syllabus": [
    {
      "title": "Introduction",
      "lessons": [
        {
          "title": "Getting started with Python",
          "description": "Meet the instructor and preview key topics in this course, including data types, control flow, classes, object-oriented programming, and modules. This video shows a practical, crash-course approach to Python fundamentals and how to start coding confidently.",
          "duration": "PT50S",
          "url": "https://www.linkedin.com/learning/python-essential-training-18764650/getting-started-with-python",
          "isFreePreview": true,
          "requiresSubscription": false
        },
        {
          "title": "Who this course is for",
          "description": "This course is for anyone who wants to learn programming. Basic computer skills are required.",
          "duration": "PT2M55S",
          "url": "https://www.linkedin.com/learning/python-essential-training-18764650/who-this-course-is-for-23812785",
          "isFreePreview": true,
          "requiresSubscription": false
        },
        {
          "title": "Resources for this course",
          "description": "In this video, learn about the resources needed for this course so you can follow along.",
          "duration": "PT1M15S",
          "url": "https://www.linkedin.com/learning/python-essential-training-18764650/resources-for-this-course",
          "isFreePreview": true,
          "requiresSubscription": false
        }
      ]
    },
    "..."
  ],
  "certificates": [
    {
      "name": "LinkedIn Learning Certificate of Completion",
      "description": "Share what you’ve learned, and be a standout professional in your desired industry with a certificate showcasing your knowledge gained from the course.",
      "url": "https://www.linkedin.com/help/learning/answer/a598944/learning-certificates-of-completion-faqs"
    }
  ]
}
```

**Lesson fields**

| Field | Type | What it does |
|---|---|---|
| `contentType` | string | The kind of public content in this row. |
| `id` | string | Source content ID for joining records and checking the source. |
| `title` | string | Content title. |
| `url` | string | Canonical public content page link. |
| `description` | string | Public content description. |
| `duration` | string | Content length as shown by the source. |
| `language` | string | Content language listed by the source. |
| `publishedAt` | string | Source publication date. |
| `imageUrl` | string | Content cover image link. |
| `instructors` | array of objects | Public instructors for this content. |
| `instructors[].name` | string | Instructor name. |
| `instructors[].professionalTitle` | string | Public job title or headline. |
| `instructors[].profileUrl` | string | Public instructor profile link. |
| `instructors[].photoUrl` | string | Instructor photo link. |
| `discoveryInput` | string | The first submitted keyword, topic, or listing URL that led to this saved row. |
| `approximateMatchCount` | integer | Approximate total matches reported by the source for that discovery input. |
| `parentCourseUrl` | string | Public page link for the parent course. |
| `isFreePreview` | boolean | Whether the source offers this lesson as a free preview. |
| `requiresSubscription` | boolean | Whether the source says a subscription is needed for this lesson. |

**Example lesson row**

This genuine lesson row is shown in full. These examples come from successful runs on the current beta build.

```json
{
  "contentType": "lesson",
  "id": "python-essential-training-18764650/getting-started-with-python",
  "title": "Getting started with Python - Python Essential Training",
  "url": "https://www.linkedin.com/learning/python-essential-training-18764650/getting-started-with-python",
  "description": "Get a comprehensive overview of the Python programming language and gain enough command of Python 3 to create well-designed scripts and maintain existing projects.",
  "duration": "PT50S",
  "language": "en",
  "publishedAt": "2023-01-25",
  "imageUrl": "https://media.licdn.com/dms/image/v2/D560DAQEruxcXLwzu_A/learning-public-crop_675_1200/B56Z1oT93iKkAY-/0/1775571558434?e=2147483647&v=beta&t=J1obbigq6mj2wpN2b9Fu7Zyt6mkPdO5-NlYw1yByIOU",
  "instructors": [
    {
      "name": "Ryan Mitchell",
      "professionalTitle": "O'Reilly / Wiley Author | LinkedIn Learning Instructor | Principal Software Engineer @ GLG",
      "profileUrl": "https://www.linkedin.com/in/remitchell",
      "photoUrl": "https://media.licdn.com/dms/image/v2/C5603AQHi4kzL_mpFUQ/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1649094417238?e=2147483647&v=beta&t=oRk6DnpL3tJsl4O21gRLOriJuGSt40sVxDFa5Zxuwtk"
    }
  ],
  "parentCourseUrl": "https://www.linkedin.com/learning/python-essential-training-18764650",
  "isFreePreview": true,
  "requiresSubscription": false
}
```

**Learning path fields**

| Field | Type | What it does |
|---|---|---|
| `contentType` | string | The kind of public content in this row. |
| `id` | string | Source content ID for joining records and checking the source. |
| `title` | string | Content title. |
| `url` | string | Canonical public content page link. |
| `description` | string | Public content description. |
| `duration` | string | Content length as shown by the source. |
| `language` | string | Content language listed by the source. |
| `imageUrl` | string | Content cover image link. |
| `instructors` | array of objects | Public instructors for this content. |
| `instructors[].name` | string | Instructor name. |
| `instructors[].professionalTitle` | string | Public job title or headline. |
| `instructors[].profileUrl` | string | Public instructor profile link. |
| `instructors[].photoUrl` | string | Instructor photo link. |
| `discoveryInput` | string | The first submitted keyword, topic, or listing URL that led to this saved row. |
| `approximateMatchCount` | integer | Approximate total matches reported by the source for that discovery input. |
| `courses` | array of objects | Member courses in source order. This may be empty. |
| `courses[].id` | string | Source course ID for joining course records. |
| `courses[].title` | string | Course title. |
| `courses[].url` | string | Canonical course page link. |
| `courses[].description` | string | Public course description. |
| `courses[].duration` | string | Course length as shown by the source. |

**Example learning path row**

This genuine learning-path row is shown in full. These examples come from successful runs on the current beta build.

```json
{
  "contentType": "learningPath",
  "id": "paths/getting-started-with-python",
  "title": "Getting Started with Python",
  "url": "https://www.linkedin.com/learning/paths/getting-started-with-python",
  "duration": "18 hours of content",
  "imageUrl": "https://media.licdn.com/dms/image/v2/C560DAQETr8p-RgTxVA/learning-public-crop_240_432/learning-public-crop_240_432/0/1600977664338?e=2147483647&v=beta&t=ZFD2wVJ20S54eJW3MggosdQvUVsfWD0qao2F8Rz2wUs",
  "discoveryInput": "Python",
  "approximateMatchCount": 38,
  "description": "Note: This learning path will be updated on November 2, 2026. To earn your certificate of completion without interruption, complete the path before that date. If you can't, additional courses may be required.Python is one of the most in-demand programming languages. Whether you're a new programmer looking to switch careers or an experienced coder looking to expand your fit within a challenging job market, this path will provide you with the foundational skills for coding in Python.",
  "language": "en",
  "instructors": [
    {
      "name": "Joe Marini",
      "professionalTitle": "Investor ᠅ 2x Exit Founder ᠅ Developer Relations & Partner Ecosystem Advocate ᠅ Technology Instructor with 10M Learners",
      "profileUrl": "https://www.linkedin.com/in/joemarini",
      "photoUrl": "https://media.licdn.com/dms/image/v2/C4E03AQHDjlOZBQoY7g/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1598399759707?e=2147483647&v=beta&t=v2tesTP21YOxWM3ntWCJc7nSiBGdYkqY1Sbtozd51is"
    },
    {
      "name": "Ryan Mitchell",
      "professionalTitle": "O'Reilly / Wiley Author | LinkedIn Learning Instructor | Principal Software Engineer @ GLG",
      "profileUrl": "https://www.linkedin.com/in/remitchell",
      "photoUrl": "https://media.licdn.com/dms/image/v2/C5603AQHi4kzL_mpFUQ/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1649094417238?e=2147483647&v=beta&t=oRk6DnpL3tJsl4O21gRLOriJuGSt40sVxDFa5Zxuwtk"
    },
    {
      "name": "Kathryn Hodge",
      "professionalTitle": "Software Engineer",
      "profileUrl": "https://www.linkedin.com/in/blondiebytes",
      "photoUrl": "https://media.licdn.com/dms/image/v2/D4D03AQGrIVVnCrSZlw/profile-displayphoto-shrink_400_400/B4DZfIjjwAH4Ak-/0/1751416454501?e=2147483647&v=beta&t=-wzLqZTL7-CXA2ctGrU3162WBIMhVVs_SSP46EMF9ag"
    },
    {
      "name": "Barron Stone",
      "professionalTitle": "Director of Product Marketing at Defense Unicorns",
      "profileUrl": "https://www.linkedin.com/in/barronstone"
    },
    {
      "name": "Jonathan Fernandes",
      "professionalTitle": "AI/ML Engineer Building & Shipping Production-ready GenAI & Large Language Model Solutions Since Before ChatGPT.",
      "profileUrl": "https://uk.linkedin.com/in/jonathanafernandes",
      "photoUrl": "https://media.licdn.com/dms/image/v2/D4E03AQGFheTNCt6p-w/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1695575572394?e=2147483647&v=beta&t=0vDF338QvW1O2V3f1QpanosAbyEQHYSvrGPvZfx_yDw"
    }
  ],
  "courses": [
    {
      "id": "learning-python-25309312",
      "title": "Learning Python",
      "url": "https://www.linkedin.com/learning/learning-python-25309312",
      "description": "This course gives you everything you need to start programming in Python, from building your first program up through working with files, data and the internet.",
      "duration": "3h 41m"
    },
    {
      "id": "python-essential-training-18764650",
      "title": "Python Essential Training",
      "url": "https://www.linkedin.com/learning/python-essential-training-18764650",
      "description": "Get a comprehensive overview of the Python programming language and gain enough command of Python 3 to create well-designed scripts and maintain existing projects.",
      "duration": "4h 23m"
    },
    {
      "id": "python-object-oriented-programming-22888296",
      "title": "Python Object-Oriented Programming",
      "url": "https://www.linkedin.com/learning/python-object-oriented-programming-22888296",
      "description": "Learn how to use the object-oriented features of Python, including magic methods and data classes, to write more efficient and effective code.",
      "duration": "1h 56m"
    },
    {
      "id": "learning-the-python-3-standard-library",
      "title": "Learning the Python 3 Standard Library",
      "url": "https://www.linkedin.com/learning/learning-the-python-3-standard-library",
      "description": "Explore the Python 3 standard library. Learn how to take advantage of its built-in modules to calculate statistics, format dates and times, get content from the internet, and more.",
      "duration": "2h 16m"
    },
    {
      "id": "programming-foundations-data-structures-25191158",
      "title": "Programming Foundations: Data Structures",
      "url": "https://www.linkedin.com/learning/programming-foundations-data-structures-25191158",
      "description": "Learn how to effectively use and implement key data structures through hands-on exercises and real-world examples in Python.",
      "duration": "2h 46m"
    },
    {
      "id": "level-up-python",
      "title": "Level Up: Python",
      "url": "https://www.linkedin.com/learning/level-up-python",
      "description": "Want to test your Python skills? These concise, self-contained challenges let you stretch your brain and test your talents.",
      "duration": "57m"
    },
    {
      "id": "8-things-you-must-know-in-python",
      "title": "8 Things You Must Know in Python",
      "url": "https://www.linkedin.com/learning/8-things-you-must-know-in-python",
      "description": "Learn eight things you should know to move beyond the basics of Python coding.",
      "duration": "50m"
    },
    {
      "id": "python-practice-real-world-coding-challenges",
      "title": "Python Practice: Real-World Coding Challenges",
      "url": "https://www.linkedin.com/learning/python-practice-real-world-coding-challenges",
      "description": "Get practice using Python by completing the challenges in this project-based course.",
      "duration": "46m"
    }
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. Check the pricing panel for current prices and tiers.

| Event | What it covers |
|---|---|
| Course | One public course saved with its available details. Nested syllabus lessons have no extra charge. |
| Lesson | One public lesson saved on its own with its available details. |
| Learning path | One public learning path saved with its available details. Nested member courses have no extra charge. |

Duplicates, failures, and empty results are not charged. A lesson inside a course syllabus is not charged as a separate lesson. A course inside a learning path is not charged as a separate course.

#### 🔌 Integrations

Open the dataset after a run, export its data, or read the structured rows through the Apify dataset API. Use the source links and IDs to connect course data to your own training reports or applications.

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I mix courses, lessons, and learning paths in one run?

Yes, with Content URLs. Each submitted page returns its own type. For Keywords, Topics, or Listing URLs, choose one result type for the run.

##### Why is a field missing or a syllabus section empty?

Only public details exposed by the source are returned. Reviews, syllabus lessons, certificate details, and other optional fields may be missing or empty. Lesson and free-preview counts may include lessons absent from the public syllabus.

##### What happens when two search terms find the same course?

The first eligible match is saved at once. Later matches are ignored. The saved row is not updated to collect later search terms. When present, `discoveryInput` keeps only the first match.

##### Do filters apply to a course URL?

No. Discovery filters apply to Keywords, Topics, and Listing URLs. Content URLs collect the submitted pages directly.

##### What does an empty Maximum results field do?

It returns all available results until the source is exhausted. This does not promise complete global catalog coverage. A limit applies across the whole run, rather than separately to each keyword or URL.

##### Is the match count exact?

No. `approximateMatchCount` is the source's estimate for the discovery input. It is not the number of rows saved by the run.

##### Can I use this to find LinkedIn Learning free courses?

The Actor returns public access details, not a guarantee that a whole course is free. Use `isFreePreview`, `requiresSubscription`, `freePreviewCount`, and `accessModel` when returned to review the source's access rules. Free previews do not mean a full course or its certificate is free.

##### Does it issue a LinkedIn Learning certificate?

No. It reads publicly listed certificate information. It does not complete courses, issue certificates, or read a learner's completion history.

##### Can it download videos or transcripts?

No. It collects public catalog metadata. Video playback, downloads, transcripts, and exercise files are outside its scope.

##### Do I need a LinkedIn account?

No. The Actor collects public catalog metadata without requiring a LinkedIn account. It does not collect private recommendations or account-only data.

### 📝 Changelog

**v0.0** (03-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~linkedin-learning-courses/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [LinkedIn Profile Scraper No Cookie](https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie) collects public professional profiles to research instructors from returned profile links.
- [Skool API](https://apify.com/maximedupre/skool-api) finds public learning communities and their visible profile and access details for research alongside course catalogs.
- [LinkedIn Learning API: Course Data, Reviews & Syllabus](https://apify.com/johnvc/linkedin-learning-api) offers another course-data option for review and syllabus research.
- [LinkedIn Learning Courses Scraper](https://apify.com/automation-lab/linkedin-learning-course-catalog) offers another public course-catalog option for instructor and skill research.
- [LinkedIn Learning Courses Scraper - Course Discovery & Details](https://apify.com/thirdwatch/linkedin-courses-scraper) offers another keyword-based course search for training comparisons.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `resultType` (type: `string`):

Choose what to find with Keywords, Topics, or Listing URLs. Content URLs return the type at each submitted URL.

## `findBy` (type: `string`):

Choose how to find public content. Only the fields for this choice are used.

## `keywords` (type: `array`):

Enter one or more search terms. All terms use the same filters.

## `topics` (type: `array`):

Enter topic slugs or public topic URLs, such as python or https://www.linkedin.com/learning/topics/python.

## `listingUrls` (type: `array`):

Enter public LinkedIn Learning search or all-courses URLs.

## `contentUrls` (type: `array`):

Enter up to 200 public course, lesson, or learning-path URLs. You can mix these kinds. Each URL returns its own content type. Discovery filters do not apply.

## `levels` (type: `array`):

Keep matches at these levels. Leave empty for all levels. Applies to Keywords, Topics, and Listing URLs.

## `duration` (type: `string`):

Keep matches in this length range. Applies to Keywords, Topics, and Listing URLs.

## `software` (type: `string`):

Enter a software tool name, such as Excel. Leave empty for any tool. Applies to Keywords, Topics, and Listing URLs.

## `sort` (type: `string`):

Choose the source order for Keywords, Topics, and Listing URLs.

## `releasedWithin` (type: `string`):

Keep recent releases for Keywords, Topics, and Listing URLs.

## `maxItems` (type: `integer`):

Stop after this many results across the run. Leave empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "resultType": "courses",
  "findBy": "keywords",
  "keywords": [
    "Python"
  ],
  "duration": "all",
  "sort": "relevance",
  "releasedWithin": "any",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Open the collected courses, lessons, and learning paths.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "resultType": "courses",
    "keywords": [
        "Python"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/linkedin-learning-courses").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "resultType": "courses",
    "keywords": ["Python"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/linkedin-learning-courses").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "resultType": "courses",
  "keywords": [
    "Python"
  ],
  "maxItems": 10
}' |
apify call maximedupre/linkedin-learning-courses --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/linkedin-learning-courses"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cDVUYyMUiA04kcAnH/builds/Zii1aM9ztPbxltEGy/openapi.json
