{
  "openapi": "3.0.1",
  "info": {
    "title": "Udemy Course Reviews Scraper: Course Stats & Rating",
    "description": "Udemy Course Reviews Scraper extracts course reviews, ratings, course stats, reviewer details, review text, dates, helpful votes, enrollment data, and course information. Ideal for course research, competitor analysis, learner feedback, and rating insights.",
    "version": "0.1",
    "x-build-id": "5yxXThWRDq8vlUDWk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~udemy-course-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-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/scrapier~udemy-course-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-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/scrapier~udemy-course-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-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": {
          "courseTargets": {
            "title": "📚 Udemy Courses",
            "type": "array",
            "description": "One entry per course. Accepts a full course URL, a course slug, or a numeric course ID.\\n\\nExamples: https://www.udemy.com/course/100-days-of-code/ · 100-days-of-code · 2776760",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "🔗 Course URLs (legacy key)",
            "type": "array",
            "description": "Kept so existing runs and saved input files keep working. Entries here are merged with 📚 Udemy Courses. New runs can leave this empty.",
            "items": {
              "type": "string"
            }
          },
          "reviewsPerCourse": {
            "title": "🎯 Reviews Per Course",
            "minimum": 1,
            "type": "integer",
            "description": "How many reviews to collect for each course. Udemy serves a maximum of 10,000 reviews per course, so any value above that is capped.\\n\\nExample: 100 returns up to 100 reviews per course. Default is 10."
          },
          "maxItems": {
            "title": "🔢 Max Reviews Per Course (legacy key)",
            "minimum": 1,
            "type": "integer",
            "description": "Kept so existing runs and saved input files keep working. Used only when 🎯 Reviews Per Course is left empty. Default is 10.",
            "default": 10
          },
          "includeCourseRow": {
            "title": "📊 Add A Course Summary Row",
            "type": "boolean",
            "description": "Adds one extra row per course (type = course) holding the complete course record, the rating breakdown, the derived analytics and the coverage figures. The row is written after that course's reviews so its coverage numbers are final. It is also mirrored to a separate per-run course dataset.",
            "default": true
          },
          "courseFieldSet": {
            "title": "🧾 Course Columns On Review Rows",
            "enum": [
              "essential",
              "full"
            ],
            "type": "string",
            "description": "How much course context to repeat on every review row.\\n\\nEssential = course ID, title, rating, review total, students, level and instructor name.\\nFull = all of the above plus headline, price and currency, locale and language, content hours, lecture count, certificate flag, badges, published and last-updated dates, category, subcategory, status, image and the full instructor block.",
            "default": "full"
          },
          "includeRatingBreakdown": {
            "title": "⭐ Add The Per-Star Rating Breakdown",
            "type": "boolean",
            "description": "Adds ratingDistribution and ratingDistributionPct plus flat ratingCount1-5 and ratingPct1-5 columns, the distribution total, and the exact gap between that total and the course's published review count (reported as-is, never rounded away).",
            "default": true
          },
          "includeDerivedMetrics": {
            "title": "📈 Add Derived Course Analytics",
            "type": "boolean",
            "description": "Adds ratingRecencyDelta (recent average minus lifetime average), reviewToEnrollmentRatio, courseAgeDays and daysSinceLastUpdate. On the course summary row it also adds reviewsCollected, apiReviewCap and sampleCoveragePct.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy Configuration",
            "type": "object",
            "description": "Optional. Leave off for normal runs; enable it for large batches or 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}