{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Learning API: Course Data, Reviews & Syllabus",
    "description": "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.",
    "version": "0.0",
    "x-build-id": "tPyC5fbqCNIOG3fcL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/johnvc~linkedin-learning-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-johnvc-linkedin-learning-api",
        "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/johnvc~linkedin-learning-api/runs": {
      "post": {
        "operationId": "runs-sync-johnvc-linkedin-learning-api",
        "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/johnvc~linkedin-learning-api/run-sync": {
      "post": {
        "operationId": "run-sync-johnvc-linkedin-learning-api",
        "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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "details"
            ],
            "type": "string",
            "description": "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).",
            "default": "search"
          },
          "queries": {
            "title": "Search queries",
            "maxItems": 25,
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "topics": {
            "title": "Topic pages",
            "maxItems": 25,
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "RELEVANCE",
              "POPULARITY",
              "RECENCY"
            ],
            "type": "string",
            "description": "Order the search results. 'Most relevant' is LinkedIn's default ranking, 'Most popular' favours high view counts, and 'Newest' favours recent release dates.",
            "default": "RELEVANCE"
          },
          "difficultyLevel": {
            "title": "Difficulty level",
            "enum": [
              "ANY",
              "BEGINNER",
              "INTERMEDIATE",
              "ADVANCED"
            ],
            "type": "string",
            "description": "Keep only courses at one skill level. Leave as 'Any level' to include all of them.",
            "default": "ANY"
          },
          "entityType": {
            "title": "Content type",
            "enum": [
              "ANY",
              "COURSE",
              "VIDEO",
              "LEARNING_PATH"
            ],
            "type": "string",
            "description": "Keep only one kind of content. Courses are full multi-lesson courses, videos are single lessons, and learning paths are curated multi-course tracks.",
            "default": "ANY"
          },
          "duration": {
            "title": "Time to complete",
            "enum": [
              "ANY",
              "BETWEEN_0_TO_10_MIN",
              "BETWEEN_10_TO_30_MIN",
              "BETWEEN_30_TO_60_MIN",
              "BETWEEN_1_TO_2_HOURS",
              "BETWEEN_2_TO_3_HOURS",
              "MORE_THAN_3_HOURS"
            ],
            "type": "string",
            "description": "Keep only courses that fall in one length bracket.",
            "default": "ANY"
          },
          "softwareNames": {
            "title": "Software covered",
            "maxItems": 10,
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "maxItems": {
            "title": "Maximum results per query",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "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.",
            "default": 50
          },
          "expandWithFilters": {
            "title": "Widen coverage past 50 results",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "enrichDetails": {
            "title": "Include full course details",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "courseUrls": {
            "title": "Course URLs",
            "maxItems": 200,
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "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.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout in seconds",
            "minimum": 10,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for a single page before giving up and retrying it.",
            "default": 40
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}