{
  "openapi": "3.0.1",
  "info": {
    "title": "Udemy Course Reviews Scraper: Instructor Course Catalog",
    "description": "Udemy Course Reviews Scraper extracts instructor course catalogs with course titles, URLs, ratings, reviews, prices, student counts, and instructor details. Analyze all courses from an instructor for competitor research, course discovery, and education market insights.",
    "version": "0.1",
    "x-build-id": "doiiot8OAVf4mdxbI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/simpleapi~udemy-course-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-simpleapi-udemy-course-reviews-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/simpleapi~udemy-course-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-simpleapi-udemy-course-reviews-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/simpleapi~udemy-course-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-simpleapi-udemy-course-reviews-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": {
          "targets": {
            "title": "🎯 Course Or Instructor Targets",
            "type": "array",
            "description": "Udemy course URLs, course slugs, numeric course IDs, or an instructor reference written as instructor:31334738.\n\nExample: https://www.udemy.com/course/100-days-of-code/\n\nEach course target is matched to its instructor, and the instructor's whole published catalog is added to the run.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "🔗 Course URLs (legacy)",
            "type": "array",
            "description": "Kept for backward compatibility with the original input format. Anything listed here is merged into Course Or Instructor Targets. Leave empty if you use the field above.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "🆔 Course Slugs Or IDs (legacy)",
            "type": "array",
            "description": "Kept for backward compatibility. Accepts a course slug such as 100-days-of-code or a numeric course ID such as 2776760. These are merged into Course Or Instructor Targets. It is not a search box.",
            "items": {
              "type": "string"
            }
          },
          "reviewsPerCourse": {
            "title": "📥 Reviews Per Course",
            "minimum": 0,
            "type": "integer",
            "description": "How many reviews to collect for EACH course, including every course discovered from the instructor's catalog. This budget is per course, so discovered courses never consume the budget of the course you supplied.\n\nExample: 10 reviews x 8 courses = up to 80 review rows. Set 0 to take as many as the source will return."
          },
          "maxItems": {
            "title": "🔢 Max Reviews Per Course (legacy)",
            "minimum": 1,
            "type": "integer",
            "description": "Kept for backward compatibility with the original input format. Used only when Reviews Per Course is left empty."
          },
          "expandInstructorCatalog": {
            "title": "👨‍🏫 Expand To The Instructor's Whole Catalog",
            "type": "boolean",
            "description": "On (default): every target is matched to its instructor and every other course that instructor publishes is added to the run.\n\nOff: only the courses you listed are collected, exactly like the original reviews scraper.",
            "default": true
          },
          "maxCoursesPerInstructor": {
            "title": "📚 Max Catalog Courses Per Instructor",
            "minimum": 0,
            "type": "integer",
            "description": "Caps how many courses are taken FROM the instructor's catalog, per instructor. The course you supplied is always collected and is not counted against this cap.\n\nExample: an instructor with 8 published courses and a cap of 3 gives you your course plus the 3 top-ranked catalog courses. Set 0 for the whole catalog. Default is 10.",
            "default": 10
          },
          "catalogSortBy": {
            "title": "🥇 Which Catalog Courses To Take First",
            "enum": [
              "most_reviews",
              "highest_rated",
              "most_students",
              "newest"
            ],
            "type": "string",
            "description": "Ranking applied to the instructor's catalog before the cap above is applied. Changes WHICH courses you get when the cap is smaller than the catalog.",
            "default": "most_reviews"
          },
          "minCourseReviews": {
            "title": "🧹 Skip Catalog Courses Below This Review Count",
            "minimum": 0,
            "type": "integer",
            "description": "Drops small or brand-new courses from the instructor's catalog before ranking.\n\nExample: 5000 keeps only the instructor's established courses. Set 0 to keep everything. Default is 0.",
            "default": 0
          },
          "emitInstructorSummary": {
            "title": "📊 Add An Instructor Portfolio Summary Row",
            "type": "boolean",
            "description": "Adds one row per instructor (type = instructor) with courses published, total reviews and students across the catalog, a review-count-weighted average rating, the highest and lowest rated course, and the price range. Also written to a separate per-run instructor table.",
            "default": true
          },
          "includeReviewerProfile": {
            "title": "🙋 Add Reviewer Identity Columns",
            "type": "boolean",
            "description": "Adds reviewerName, reviewerProfileUrl, reviewerId and reviewerAvatarUrl to each review row.\n\nHonest coverage note: reviewerProfileUrl is present on almost every review (79 of 80 on a live run), reviewerId on roughly 7 to 8 in 10 (67 of 80). When a value is genuinely unavailable the column is null - it is never filled in with a guess. Udemy publishes no reviewer history, so none is offered.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy Configuration",
            "type": "object",
            "description": "Optional network routing for the run. Leave off unless your runs need it."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}