{
  "openapi": "3.0.1",
  "info": {
    "title": "Udemy Course Reviews Scraper — Syllabus, Lectures & Quizzes",
    "description": "Udemy Course Reviews Scraper extracts course reviews, ratings, syllabus, lectures, quizzes, instructor details, pricing, and course metadata. Ideal for course research, learner sentiment analysis, competitor analysis, curriculum insights, and online education market intelligence.",
    "version": "0.1",
    "x-build-id": "2u0gzDZdRmOXCKawh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapio~udemy-reviews-actor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapio-udemy-reviews-actor",
        "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/scrapio~udemy-reviews-actor/runs": {
      "post": {
        "operationId": "runs-sync-scrapio-udemy-reviews-actor",
        "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/scrapio~udemy-reviews-actor/run-sync": {
      "post": {
        "operationId": "run-sync-scrapio-udemy-reviews-actor",
        "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": {
          "courseLinks": {
            "title": "📖 Course Links",
            "type": "array",
            "description": "One or more Udemy course links.\n\nExample: https://www.udemy.com/course/100-days-of-code/\n\nAdd several links to cover many courses in one run. Leave this empty and fill 🆔 Course IDs or Slugs instead if you already have course identifiers.",
            "items": {
              "type": "string"
            }
          },
          "courseIdsOrSlugs": {
            "title": "🆔 Course IDs or Slugs",
            "type": "array",
            "description": "Optional second way to name the same courses: a numeric Udemy course ID (for example 2776760) or a course slug (for example 100-days-of-code).\n\nThese are added to whatever is in 📖 Course Links. Anything that cannot be matched to a real course is reported as not found instead of returning an empty result.",
            "items": {
              "type": "string"
            }
          },
          "reviewSampleSize": {
            "title": "🧾 Reviews Per Course",
            "minimum": 0,
            "type": "integer",
            "description": "How many reviews to collect for each course.\n\nExample: 10 gives a quick sample, 500 gives a deep read. Set 0 to skip reviews entirely and collect only the curriculum outline. Default is 10.\n\nOnly reviews that contain written text are returned; rating-only stars are not part of this sample."
          },
          "includeCurriculum": {
            "title": "🧱 Collect The Curriculum Outline",
            "type": "boolean",
            "description": "Add the course syllabus to the run: sections, lectures, quizzes, practice tests, coding exercises, durations and free-preview flags.\n\nTurn off if you only want reviews. Default is true.",
            "default": true
          },
          "curriculumDetail": {
            "title": "🔍 Outline Detail",
            "enum": [
              "sectionsAndItems",
              "sections"
            ],
            "type": "string",
            "description": "How deep the outline goes.\n\n• Sections only - one row per course section with its lecture count and total duration.\n• Sections and items - one row per individual lecture / quiz / practice test, each carrying its section title and index.\n\nDefault is sections and items.",
            "default": "sectionsAndItems"
          },
          "curriculumItemTypes": {
            "title": "🏷️ Item Types To Keep",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these curriculum item types. Leave empty to keep every type.\n\nExample: pick 🧪 Quiz to get only the knowledge checks of a course. Applies to sections-and-items detail only.",
            "items": {
              "type": "string",
              "enum": [
                "lecture",
                "quiz",
                "practice",
                "role_play",
                "coding_exercise"
              ],
              "enumTitles": [
                "🎬 Lecture",
                "🧪 Quiz",
                "📝 Practice test",
                "🎭 Role play",
                "💻 Coding exercise"
              ]
            }
          },
          "freePreviewOnly": {
            "title": "🆓 Free-Preview Items Only",
            "type": "boolean",
            "description": "Keep only the curriculum items a course makes publicly previewable.\n\nExample: on one AWS certification course this narrows 425 items down to 46. Default is false.",
            "default": false
          },
          "maxCurriculumItemsPerCourse": {
            "title": "🔢 Max Curriculum Rows Per Course",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the number of curriculum rows produced for each course, counted after the type and free-preview filters.\n\n0 means no cap. Default is 0.",
            "default": 0
          },
          "includeContentMetrics": {
            "title": "📊 Course Content Metrics Row",
            "type": "boolean",
            "description": "Add one summary row per course with the composition of its content: section count, lecture / quiz / practice counts, coding-exercise count, hands-on percentage, free-preview count and percentage, workspace and lab item counts, total video hours, average lecture length, longest and shortest section, and the exact gaps between the published syllabus and the course-level counters.\n\nDefault is true.",
            "default": true
          },
          "attachContentToReviews": {
            "title": "🔗 Add Content Summary To Review Rows",
            "type": "boolean",
            "description": "Copy a compact content summary (lecture count, total video hours, hands-on percentage, free-preview count) onto every review row of that course, so a single export shows what a reviewer was actually reacting to.\n\nDefault is false.",
            "default": false
          },
          "includeCaptionLanguages": {
            "title": "🌍 Caption & Language Block",
            "type": "boolean",
            "description": "Add the course language, whether closed captions exist, how many caption languages are offered and the full list of them.\n\nExample: 31 caption languages on one bootcamp, 12 on another. Default is false.",
            "default": false
          },
          "includeSyllabusPromises": {
            "title": "🎯 Learning Outcomes Block",
            "type": "boolean",
            "description": "Add what the course says it teaches: learning outcomes, prerequisites, intended audiences and the course FAQ question / answer pairs.\n\nDefault is false.",
            "default": false
          },
          "urls": {
            "title": "🔗 Course URLs (legacy alias)",
            "type": "array",
            "description": "Same meaning as 📖 Course Links. Anything placed here is merged with it.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "🎯 Max Reviews Per Course (legacy alias)",
            "minimum": 0,
            "type": "integer",
            "description": "Same meaning as 🧾 Reviews Per Course. Used only when 🧾 Reviews Per Course is left empty."
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy Configuration",
            "type": "object",
            "description": "Optional network routing for the run.\n\nLeave the default for normal use. Enabling it is recommended for large batches or on restricted networks."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}