# LinkedIn Learning API: Course Data, Reviews & Syllabus (`johnvc/linkedin-learning-api`) Actor

Course data API for LinkedIn Learning. Search by keyword, level, length or software and return full course records: rating, learner review text, the full syllabus with per-lesson descriptions, free-lesson flags, instructors, skills and certificates. No login or cookies. Pay per course, MCP ready.

- **URL**: https://apify.com/johnvc/linkedin-learning-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Education, Developer tools
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.41 / 1,000 full course records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Learning API

Course data API for LinkedIn Learning. Build a LinkedIn Learning course catalog or course list programmatically: search by keyword, skill level, length or software, and pull the full record for any course: rating, written learner reviews, the complete syllabus with a description for every lesson, which lessons are free to watch, instructors with their profile links, skills taught, and certificate details. Everything comes from the pages LinkedIn already publishes to logged-out visitors, so no login, account, or cookie is ever involved.

### What this actor returns: the LinkedIn Learning course catalog as structured data

- **Course records with real depth.** Rating and rating count, learner numbers, difficulty level, language, release dates, skills taught, category path, and certificate information.
- **Written learner reviews.** The review text itself, with each reviewer's name, job title, and LinkedIn profile link. Most course APIs return only a star average.
- **The full syllabus.** Every section and lesson, each with its own title, written description, length, and a flag for whether it can be watched free without a subscription.
- **Instructors as structured people.** Name, job title, profile link, and photo, ready to join against other LinkedIn data.
- **Search results with the filters LinkedIn actually uses.** Sort order, skill level, content type, length bracket, and software covered, plus an approximate total match count for the query.
- **Lessons and learning paths too.** A lesson URL returns that lesson, and a learning path returns the ordered list of courses inside it.

### Use cases: course lists, learner reviews and learning paths

- **Build a skills taxonomy.** Map which courses teach a given tool or skill, at what level, and how long they take, to plan an internal upskilling programme.
- **Benchmark a course catalogue.** Compare your own training library against what LinkedIn Learning offers on the same topics, using ratings and learner counts as demand signals.
- **Find the free lessons.** Surface every lesson that can be watched without a subscription, so you can share a genuinely accessible starting point with a team.
- **Track sentiment on a topic.** Pull the written reviews across a set of courses to see what learners actually praise or complain about.
- **Feed a course recommender.** Give an AI agent structured course records, syllabus included, so it can match a learning goal to specific lessons rather than whole courses.

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `mode` | select | yes | `search` | `search` to find courses by keyword, `details` to pull full records for URLs you already have. |
| `queries` | list of text | search mode | (prefilled `python`) | Keywords to search. Each is searched separately. Up to 25 per run. |
| `topics` | list of text | no | `[]` | LinkedIn Learning topic slugs or topic URLs to browse instead of, or alongside, keyword search. Up to 25 per run. |
| `sortBy` | select | no | `RELEVANCE` | `RELEVANCE`, `POPULARITY`, or `RECENCY`. |
| `difficultyLevel` | select | no | `ANY` | `BEGINNER`, `INTERMEDIATE`, or `ADVANCED`. |
| `entityType` | select | no | `ANY` | `COURSE`, `VIDEO`, or `LEARNING_PATH`. |
| `duration` | select | no | `ANY` | One of six length brackets, from under 10 minutes to over 3 hours. |
| `softwareNames` | list of text | no | `[]` | Keep only courses teaching these tools, using LinkedIn's labels (Python, Microsoft Excel, SQL, ChatGPT, Claude). Up to 10 per run. |
| `maxItems` | integer | no | `50` | Courses to return per query, up to 1000. See the note on the 50-result ceiling below. |
| `expandWithFilters` | boolean | no | `false` | Re-run each query across LinkedIn's filter combinations to get past the 50-result ceiling. |
| `enrichDetails` | boolean | no | `false` | Open every search result and return its full record instead of the search row. |
| `courseUrls` | list of text | details mode | `[]` | Course, lesson, or learning path URLs to collect in full. Up to 200 per run. |
| `maxConcurrency` | integer | no | `5` | How many course pages to read at once, 1 to 10. Applies to details mode and to enrichment. |
| `requestTimeoutSecs` | integer | no | `40` | Per-request timeout, 10 to 120 seconds. |

### Example output

A `search_result` row:

```json
{
  "position": 1,
  "title": "Python Essential Training",
  "courseUrl": "https://www.linkedin.com/learning/python-essential-training-18764650",
  "courseId": "18764650",
  "entityType": "COURSE",
  "instructors": [
    {
      "name": "Ryan Mitchell"
    }
  ],
  "durationText": "4h 23m",
  "durationSeconds": 15780,
  "thumbnailUrl": "https://media.licdn.com/dms/image/v2/D560DAQEruxcXLwzu_A/l...",
  "viewersText": "646,624 viewers",
  "releaseText": "Released Jan 25, 2023",
  "resultType": "search_result",
  "searchQuery": "python",
  "searchType": "query",
  "appliedFilters": {
    "sortBy": "RELEVANCE"
  },
  "approximateTotalResults": 9816,
  "fetchedAt": "2026-08-27T18:14:05.123456+00:00"
}
```

A `course_detail` row, trimmed to one syllabus section and one review for readability:

```json
{
  "sourceUrl": "https://www.linkedin.com/learning/python-essential-training-18764650",
  "courseUrl": "https://www.linkedin.com/learning/python-essential-training-18764650",
  "courseId": "18764650",
  "title": "Python Essential Training",
  "description": "Get a comprehensive overview of the Python programming language and gain enough command of Python 3 to create well-des...",
  "difficultyLevel": "Beginner",
  "provider": "LinkedIn Learning",
  "instructors": [
    {
      "name": "Ryan Mitchell",
      "jobTitle": "O'Reilly / Wiley Author | LinkedIn Learning Instructor | Principal Software Engineer @ GLG",
      "profileUrl": "https://www.linkedin.com/in/remitchell",
      "imageUrl": "https://media.licdn.com/dms/image/v2/C5603AQHi4kzL_mpFUQ/p..."
    }
  ],
  "skills": [
    {
      "name": "Python (Programming Language)",
      "url": "https://www.linkedin.com/learning/topics/python"
    }
  ],
  "categoryPath": [
    "All topics",
    "Technology",
    "Software Development",
    "Programming Languages"
  ],
  "dateCreated": "2023-01-25",
  "datePublished": "2023-01-25",
  "durationText": "PT4H23M9S",
  "durationSeconds": 15789,
  "enrollmentCount": 646624,
  "ratingValue": 4.7,
  "ratingCount": 17489,
  "reviews": [
    {
      "rating": 5,
      "body": "The videos featuring guest lecturers who appeared from time to time served as a break from the main code explanation videos, making for an enjoyable lecture.",
      "authorName": "Takaaki Iwai",
      "authorJobTitle": "Bose Corporation - Global Supply Chain Repair and Reman",
      "authorProfileUrl": "https://jp.linkedin.com/in/takaaki-iwai-6a53959a",
      "datePublished": "2026-08-21T05:38:27.264Z"
    }
  ],
  "language": "en",
  "tableOfContents": [
    {
      "section": "Introduction",
      "items": [
        {
          "title": "Getting started with Python",
          "durationText": "50s",
          "durationSeconds": 50,
          "url": "https://www.linkedin.com/learning/python-essential-training-18764650/getting-started-with-python",
          "isFree": true,
          "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."
        },
        {
          "title": "Who this course is for",
          "durationText": "2m 55s",
          "durationSeconds": 175,
          "url": "https://www.linkedin.com/learning/python-essential-training-18764650/who-this-course-is-for-23812785",
          "isFree": true,
          "description": "This course is for anyone who wants to learn programming. Basic computer skills are required."
        }
      ]
    }
  ],
  "lessonCount": 56,
  "freeLessonCount": 10,
  "hasCertificate": true,
  "certificateName": "LinkedIn Learning Certificate of Completion",
  "accessModel": "Subscription",
  "thumbnailUrl": "https://media.licdn.com/dms/image/v2/D560DAQEruxcXLwzu_A/l...",
  "parseSource": "jsonld",
  "resultType": "course_detail",
  "fetchedAt": "2026-08-27T18:14:05.123456+00:00"
}
```

### Pricing

This actor is pay-per-result, so you pay for the rows you receive and nothing else.

| Event | Rate | When it is charged |
|---|---|---|
| Course found | $0.10 per 1,000 courses | Once per course returned by a search or topic page. |
| Full course record | $0.50 per 1,000 records | Once per full course record, with reviews and syllabus. Replaces the search charge on enriched rows rather than adding to it. |

So a search returning 500 courses costs about $0.05, and pulling the full record for 100 of them costs about $0.05 more. Discount tiers reduce these rates, and the rates shown on the actor's Store page are always current.

Nothing is charged for duplicate courses removed by de-duplication, for error rows, or for the popular-courses list LinkedIn substitutes when a query matches nothing.

### How to get started

1. Open the actor and pick a mode. Leave it on **Search courses by keyword** for a first run.
2. Type one or more keywords into **Search queries**, for example `python`.
3. Optionally narrow by level, length, content type, or software.
4. Click **Start**, then read the results on the **Output** tab or pull them from the dataset API.

To get full records instead, switch **Mode** to **Get full details for course URLs** and paste LinkedIn Learning course links into **Course URLs**.

[View on Apify Store](https://apify.com/johnvc/linkedin-learning-api?fpr=9n7kx3)

### 🔌 Use this API from Claude (MCP)

You can add this actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any other MCP client through the hosted Apify MCP server. Point your client at:

`https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-learning-api`

Here `actors` and `docs` are the standard tool categories and the third entry is this actor. Once connected, your agent can search the LinkedIn Learning catalogue and pull full course records on its own.

Setup walkthrough:

https://www.youtube.com/watch?v=jREWahDGhJM

For more on connecting Apify actors to AI agents, see the [Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp).

### 💸 Pay per run with crypto (x402)

The LinkedIn Learning API supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-learning-api) and it can
discover, pay for, and run this Actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### 💡 Example tasks

Ready-made configurations you can run or copy, each on its own page:

- [LinkedIn Learning Course Data as JSON, No Login](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-course-data-json?fpr=9n7kx3)
- [LinkedIn Learning Course Data Without a Login](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-courses-no-login?fpr=9n7kx3)
- [Extract LinkedIn Learning Course Reviews and Ratings](https://apify.com/johnvc/linkedin-learning-api/examples/extract-linkedin-learning-course-reviews?fpr=9n7kx3)
- [Find Free Preview Lessons in LinkedIn Learning Courses](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-free-preview-lessons?fpr=9n7kx3)
- [Get LinkedIn Learning Instructors and Profile Links](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-instructor-data?fpr=9n7kx3)
- [Map Skills Taught Across the LinkedIn Learning Catalog](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-skills-coverage?fpr=9n7kx3)
- [Build a LinkedIn Learning Course Ratings Dataset](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-course-ratings-dataset?fpr=9n7kx3)
- [Track New LinkedIn Learning Course Releases](https://apify.com/johnvc/linkedin-learning-api/examples/track-new-linkedin-learning-courses?fpr=9n7kx3)
- [Scrape LinkedIn Learning Excel Course Data](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-excel-course-data?fpr=9n7kx3)
- [Scrape LinkedIn Learning Figma Course Data](https://apify.com/johnvc/linkedin-learning-api/examples/linkedin-learning-figma-course-data?fpr=9n7kx3)

### FAQ

#### How do you get a list of LinkedIn Learning courses?

Run this actor in search mode with a keyword, or point it at a topic page. LinkedIn's own Learning API is gated behind its Partner Program or a purchased site licence and needs admin OAuth keys, which is why the question keeps coming up. This actor reads the public guest catalogue instead, so it needs no credentials at all.

#### Can you download the LinkedIn Learning course catalogue?

There is no official export for it. You can build one here: run a set of keywords or topic pages, turn on **Widen coverage past 50 results**, and export the dataset as CSV, JSON or Excel. Bear in mind LinkedIn caps any single query at 50 results, so a broad catalogue is assembled from many queries rather than one.

#### Does LinkedIn Learning give certificates?

Yes, a certificate of completion, and every full course record here reports it: `hasCertificate` and `certificateName`. Note this is a certificate of completion rather than an accredited qualification.

#### Are LinkedIn Learning courses free, and how do I find the free ones?

Most need a subscription, but courses expose individual lessons as free previews. This actor flags them per lesson (`isFree` in the table of contents) and totals them as `freeLessonCount`, so you can sort a whole result set by how much is watchable without paying. No competitor returns this.

#### What is the difference between a learning path and a course?

A course is one multi-lesson unit; a learning path is a curated sequence of several courses. Both are supported: `entityType` tells them apart in search results, and passing a `/learning/paths/...` URL returns the path with its ordered member courses.

#### Does this need my LinkedIn login or cookies?

No. This actor only reads the pages LinkedIn publishes to logged-out visitors, and no request it sends carries a cookie. LinkedIn may try to set one, but the jar is emptied around every single request, including each hop of a redirect, so nothing is ever carried forward. There is no field to paste a session cookie into, and there never will be.

#### Why do I only get 50 results for a query?

That is LinkedIn's own limit: a guest search returns at most 50 courses for any one keyword and filter combination, and there is no next page to request. Two ways past it. Add more queries, since each is searched separately, or turn on **Widen coverage past 50 results**, which re-runs the query across LinkedIn's own filter combinations (sort order, content type, difficulty, length) and merges the unique courses out of them.

#### Why did a search return a `no_results` row instead of courses?

When LinkedIn cannot match a query it does not return an empty page. It returns a full page of popular courses under a "we couldn't find a match" heading. Those courses have nothing to do with your query, so this actor detects that page, returns a single `no_results` row explaining what happened, and does not charge you for any of it.

#### Is the total match count exact?

No, treat `approximateTotalResults` as a size signal. LinkedIn reports slightly different totals for the same query across page variants, so it is useful for gauging how big a topic is, not for arithmetic.

#### Can I pass a lesson URL or a learning path URL?

Yes. A lesson URL returns that lesson's own record, linked to its parent course so you can join the two. A learning path URL returns the path with its ordered list of member courses. A course URL returns the full course record.

#### A course URL returns "that page was not found". Why?

LinkedIn versions its course slugs, so an older link such as `learning-python-2020` may now be `learning-python-2021`. Retired slugs usually redirect and are followed automatically, but a slug that no longer exists at all returns a not-found error row. Use the `courseUrl` value from a search result, which is always current.

#### How many pages does it fetch at once, and can a big run time out?

Search pages are fetched one at a time on purpose, to stay polite. Course pages are fetched in parallel, up to **Parallel requests** (default 5, max 10), in both details mode and enrichment. Before a run starts, the actor estimates how long the plan will take and compares it against the run timeout. If the plan does not fit, it says so and reduces the per-query maximum rather than dying at the deadline with partial data. A very large enriched run is the only realistic way to hit this: raise the run timeout, raise Parallel requests, or split the queries across runs.

#### No results came back at all. What should I check?

Check the spelling of any filter values you set, then try the query with the filters cleared. A very narrow combination, such as an advanced course under 10 minutes on a niche tool, can legitimately match nothing.

***

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/linkedin-learning-api/issues/open?fpr=9n7kx3).

Last Updated: 2026.09.01

# Actor input Schema

## `mode` (type: `string`):

Choose what to collect. Use 'search' to find courses by keyword with filters, or 'details' to pull the full record for course URLs you already have (ratings, reviews, syllabus, instructors, certificate).

## `queries` (type: `array`):

Keywords to search, one per line. Each query is searched separately and its results are labelled with the query that found them. Used in 'search' mode only. Leave empty if you are browsing topic pages instead.

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

Optional LinkedIn Learning topic slugs or topic URLs to browse, such as 'python' or https://www.linkedin.com/learning/topics/python. Topic pages are an alternative to keyword search and return the same course fields.

## `sortBy` (type: `string`):

Order the search results. 'Most relevant' is LinkedIn's default ranking, 'Most popular' favours high view counts, and 'Newest' favours recent release dates.

## `difficultyLevel` (type: `string`):

Keep only courses at one skill level. Leave as 'Any level' to include all of them.

## `entityType` (type: `string`):

Keep only one kind of content. Courses are full multi-lesson courses, videos are single lessons, and learning paths are curated multi-course tracks.

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

Keep only courses that fall in one length bracket.

## `softwareNames` (type: `array`):

Keep only courses that teach these tools, using LinkedIn's own labels such as Python, Microsoft Excel, SQL, ChatGPT or Claude. Add one per line.

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

How many courses to return for each query. LinkedIn serves at most 50 results per query and filter combination, so ask for more than 50 only with 'Widen coverage' turned on. Up to 1000 per query. Need larger batches? Contact us and we can raise this limit for your account.

## `expandWithFilters` (type: `boolean`):

Run the same query again across LinkedIn's own filter combinations (sort order, content type, difficulty, length) and merge the unique courses. This is the only way past the 50-per-query ceiling. It fetches more pages and returns more billable rows.

## `enrichDetails` (type: `boolean`):

Open each course found by the search and return its full record, including rating, review text, syllabus and instructors. Enriched rows are billed at the course details rate instead of the search result rate, never both. This reads one extra page per course, so it is much slower than a plain search: use 'Parallel requests' to speed it up, and expect a very large enriched run to be trimmed to fit the run timeout.

## `courseUrls` (type: `array`):

LinkedIn Learning course, lesson or learning path URLs to collect in full, one per line. A course URL returns the full course record, a lesson URL returns that lesson linked to its parent course, and a learning path URL returns the path with its member courses. Up to 200 per run. Need larger batches? Contact us and we can raise this limit for your account. Used in 'details' mode only.

## `maxConcurrency` (type: `integer`):

How many course pages to read at once, in both 'details' mode and when 'Include full course details' is on. Raise it to finish a large run faster, lower it if you ever see rate limiting.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single page before giving up and retrying it.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "python"
  ],
  "topics": [],
  "sortBy": "RELEVANCE",
  "difficultyLevel": "ANY",
  "entityType": "ANY",
  "duration": "ANY",
  "softwareNames": [],
  "maxItems": 50,
  "expandWithFilters": false,
  "enrichDetails": false,
  "courseUrls": [
    "https://www.linkedin.com/learning/python-essential-training-18764650"
  ],
  "maxConcurrency": 5,
  "requestTimeoutSecs": 40
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every dataset item from this run, including any error rows.

## `courses` (type: `string`):

Tabular overview: course title, level, length, rating, learners, lessons, instructors and link.

## `details` (type: `string`):

Detail rows with the syllabus, learner reviews, skills taught and certificate information.

# 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 = {
    "queries": [
        "python"
    ],
    "courseUrls": [
        "https://www.linkedin.com/learning/python-essential-training-18764650"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/linkedin-learning-api").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 = {
    "queries": ["python"],
    "courseUrls": ["https://www.linkedin.com/learning/python-essential-training-18764650"],
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/linkedin-learning-api").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 '{
  "queries": [
    "python"
  ],
  "courseUrls": [
    "https://www.linkedin.com/learning/python-essential-training-18764650"
  ]
}' |
apify call johnvc/linkedin-learning-api --silent --output-dataset

```

## MCP server setup

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

```

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/La2BRZMUbyhY5gKNG/builds/tPyC5fbqCNIOG3fcL/openapi.json
