# LinkedIn Learning Course Scraper (No Login) (`scrapemint/linkedin-learning-course-scraper`) Actor

Pull structured LinkedIn Learning course data without a cookie or login. Each row carries title, instructors, skills covered, level, duration, release date, rating, learner count, and curriculum. Discover by instructor, by keyword, or paste course URLs. JSON. Pay per course.

- **URL**: https://apify.com/scrapemint/linkedin-learning-course-scraper.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Social media, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Course Scraper (No Login Required)

Pull structured LinkedIn Learning course data by instructor, by topic, or from a known URL list. No cookies. No login. No subscription seat. Each row ships the title, full description, instructors, skills covered, level, duration, release date, rating, learner count, language, and the full chapter and lesson curriculum. Pay per course.

**Built for** L&D teams, course competitors, instructional designers, and analysts who need clean structured access to the LinkedIn Learning catalog for skills-gap analysis, competitive benchmarking, and content planning.

**Keywords this actor ranks for:** linkedin learning scraper, linkedin learning api, linkedin course data, linkedin learning catalog export, course curriculum scraper, skills taxonomy scraper, linkedin learning to json, online course benchmarking, l&d competitive intelligence, course catalog monitoring, instructor course tracker, elearning content intel.

---

### Why this actor

| Other course scrapers | **This actor** |
|---|---|
| Need your session cookie | Zero cookies, zero login |
| Risk your seat on every run | Touches only public catalog pages with residential proxy |
| Single text blob per course | Title, description, instructors, skills, level, curriculum all parsed into discrete fields |
| Only accept direct URLs | Discover by instructor, by keyword, or paste URLs |
| Drop the curriculum | Full chapter and lesson breakdown on every row |

---

### How it works

```mermaid
flowchart LR
    A1[Course URLs] --> C[Public course page<br/>residential proxy]
    A2[Instructor names] --> B[Search engine<br/>discovery layer]
    A3[Keywords] --> B
    B --> C
    C --> D[Parse schema.org Course<br/>JSON-LD plus meta tags]
    D --> E[Normalize into discrete fields]
    E --> F[Push one row per course]
    F --> G[(JSON CSV Excel API)]
````

Discovery happens through search engines that already index public LinkedIn Learning course URLs. Each course is then fetched with a real Chrome browser fingerprint behind a residential proxy. The actor parses the schema.org `Course` JSON-LD first, then falls back to Open Graph meta tags and DOM extraction. Instructor discovery is verified against the instructors listed on each course page, so an instructor query never returns courses they did not teach.

***

### What you get per row

```mermaid
flowchart LR
    R[Course row] --> R1[Identity<br/>key url title]
    R --> R2[Instructors<br/>name profileUrl headline]
    R --> R3[Content<br/>description skills curriculum]
    R --> R4[Stats<br/>rating learnersCount durationMinutes]
    R --> R5[Taxonomy<br/>level topics language]
    R --> R6[Timing<br/>releasedAt updatedAt]
```

***

### Quick start

**Track every course from one instructor or studio**

```json
{
  "instructorNames": ["Madecraft"],
  "maxCourses": 50
}
```

**Topic discovery (find courses on a skill)**

```json
{
  "keywords": ["prompt engineering", "python data analysis"],
  "maxCourses": 25
}
```

**Enrich a known course list**

```json
{
  "courseUrls": [
    "https://www.linkedin.com/learning/learning-python"
  ]
}
```

***

### Sample output

```json
{
  "key": "learning-python",
  "url": "https://www.linkedin.com/learning/learning-python",
  "discoveredVia": { "kind": "keyword", "value": "keyword:python data analysis" },
  "title": "Learning Python",
  "description": "Get started with Python, the popular and highly readable object-oriented language...",
  "instructors": [
    {
      "name": "Joe Marini",
      "profileUrl": "https://www.linkedin.com/learning/instructors/joe-marini",
      "headline": "Product and engineering leader"
    }
  ],
  "skills": ["Python", "Object-Oriented Programming"],
  "topics": ["Software Development"],
  "level": "Beginner",
  "durationSeconds": 8520,
  "durationMinutes": 142,
  "releasedAt": "2026-02-11T00:00:00.000Z",
  "updatedAt": null,
  "rating": { "value": 4.7, "count": 18432 },
  "learnersCount": 1240000,
  "language": "en",
  "thumbnail": "https://media.licdn.com/dms/image/...",
  "curriculum": [
    {
      "section": "1. Python Basics",
      "lessons": [
        { "title": "Building your first Python program", "durationText": "4m 12s" }
      ]
    }
  ],
  "relatedCourses": ["python-quick-start", "advanced-python"],
  "scrapedAt": "2026-05-16T10:00:00.000Z"
}
```

***

### Who uses this

| Role | Use case |
|---|---|
| L\&D lead | Map a skills taxonomy across a topic to plan internal training |
| Course competitor | Track what a rival instructor or studio is publishing and how it rates |
| Instructional designer | Study curriculum structure across top rated courses before authoring |
| Talent analyst | Benchmark which skills the market is teaching and at what depth |
| Content strategist | Topic monitoring across a keyword list to spot emerging skill demand |
| Researcher | Build a structured course dataset without paying a catalog vendor |

***

### Input reference

| Field | Type | What it does |
|---|---|---|
| `courseUrls` | string\[] | Direct LinkedIn Learning course URLs. |
| `instructorNames` | string\[] | Instructors to discover courses by. Verified on each course page. |
| `keywords` | string\[] | Topics to discover courses for via public search. |
| `maxCourses` | integer | Cap per instructor or keyword. 0 means everything we can discover. |
| `includeCurriculum` | boolean | Keep the chapter and lesson breakdown on each row. Default true. |
| `concurrency` | integer | Pages processed in parallel. Six is the safe default. |
| `proxyConfiguration` | object | Apify proxy. Residential is required at any meaningful volume. |

***

### API call

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USER~linkedin-learning-course-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "keywords": ["prompt engineering"],
    "maxCourses": 25
  }'
```

***

### Pricing

The first 3 courses per run are free so you can validate output before paying. After that, each course row is charged. No surprise add on charges.

***

### FAQ

#### Do I need a LinkedIn Learning account or cookie?

No. The actor only touches the public LinkedIn Learning course pages from a residential proxy with a real Chrome fingerprint. Your account is never touched.

#### How does discovery work without my cookie?

A search engine site query finds public LinkedIn Learning course URLs from the target instructor or topic. These pages are designed to be indexed which is why courses show up in Google. The actor pulls each course from its public page after that.

#### Why do I need residential proxy?

LinkedIn aggressively blocks datacenter IPs. Residential proxy is the only configuration that consistently returns the course data to anonymous viewers. Apify residential proxy is preconfigured by default.

#### How fresh is the data?

Each run hits the live course page so rating, learner count, and updated dates reflect what LinkedIn renders at scrape time.

#### Is scraping LinkedIn allowed?

This actor reads HTML any anonymous web visitor can see. Respect LinkedIn's terms and rate limit sensibly. Do not redistribute instructor identities you have no lawful basis to process.

***

### Related actors

- **LinkedIn Pulse Articles Scraper** — long-form articles from any author or topic without a cookie
- **LinkedIn Profile & Company Post Tracker** — scrape posts from any profile or company
- **LinkedIn Company Profile Scraper** — name, industry, headcount range, HQ, specialties on every company row
- **Google Scholar Scraper** — academic papers, citations, and author metrics
- **PubMed Clinical Trials Intelligence** — structured biomedical research and trial data

# Actor input Schema

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

Direct LinkedIn Learning course URLs. Examples: 'https://www.linkedin.com/learning/learning-python'.

## `instructorNames` (type: `array`):

Instructor names whose LinkedIn Learning courses you want to scrape. The actor uses public search engine discovery and verifies the instructor on each course page. Examples: 'Madecraft', 'Olivia Chiu Stone'.

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

Topics to discover courses for via public search engines. Examples: 'python data analysis', 'project management', 'prompt engineering'.

## `maxCourses` (type: `integer`):

Hard cap on courses per instructor or keyword. Set to 0 to take everything we can discover. Ignored for direct courseUrls.

## `includeCurriculum` (type: `boolean`):

Pull the chapter and lesson breakdown. Turn off to keep only summary fields and reduce row size.

## `concurrency` (type: `integer`):

Number of pages processed in parallel. Higher concurrency runs faster but increases proxy and detection risk. Six is a safe default.

## `proxyConfiguration` (type: `object`):

Apify proxy. Residential is required for LinkedIn at any meaningful volume.

## Actor input object example

```json
{
  "courseUrls": [],
  "instructorNames": [],
  "keywords": [
    "prompt engineering"
  ],
  "maxCourses": 20,
  "includeCurriculum": true,
  "concurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "keywords": [
        "prompt engineering"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/linkedin-learning-course-scraper").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 = {
    "keywords": ["prompt engineering"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "prompt engineering"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapemint/linkedin-learning-course-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapemint/linkedin-learning-course-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Learning Course Scraper (No Login)",
        "description": "Pull structured LinkedIn Learning course data without a cookie or login. Each row carries title, instructors, skills covered, level, duration, release date, rating, learner count, and curriculum. Discover by instructor, by keyword, or paste course URLs. JSON. Pay per course.",
        "version": "0.1",
        "x-build-id": "YgHMRsoQyC77Nwto2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapemint~linkedin-learning-course-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapemint-linkedin-learning-course-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapemint~linkedin-learning-course-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapemint-linkedin-learning-course-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapemint~linkedin-learning-course-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapemint-linkedin-learning-course-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "courseUrls": {
                        "title": "Course URLs",
                        "type": "array",
                        "description": "Direct LinkedIn Learning course URLs. Examples: 'https://www.linkedin.com/learning/learning-python'.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "instructorNames": {
                        "title": "Instructor names",
                        "type": "array",
                        "description": "Instructor names whose LinkedIn Learning courses you want to scrape. The actor uses public search engine discovery and verifies the instructor on each course page. Examples: 'Madecraft', 'Olivia Chiu Stone'.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keyword search",
                        "type": "array",
                        "description": "Topics to discover courses for via public search engines. Examples: 'python data analysis', 'project management', 'prompt engineering'.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxCourses": {
                        "title": "Max courses per source",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap on courses per instructor or keyword. Set to 0 to take everything we can discover. Ignored for direct courseUrls.",
                        "default": 20
                    },
                    "includeCurriculum": {
                        "title": "Include curriculum",
                        "type": "boolean",
                        "description": "Pull the chapter and lesson breakdown. Turn off to keep only summary fields and reduce row size.",
                        "default": true
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of pages processed in parallel. Higher concurrency runs faster but increases proxy and detection risk. Six is a safe default.",
                        "default": 6
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy. Residential is required for LinkedIn at any meaningful volume.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
