{
  "openapi": "3.0.1",
  "info": {
    "title": "Udemy Course Reviews Scraper By Rating, Keyword & Date",
    "description": "Udemy Course Reviews Scraper extracts public course reviews, ratings, reviewer details, review text, and dates. Filter reviews by rating, keyword, and date range to analyze learner feedback, course quality, trends, and competitor performance.",
    "version": "0.1",
    "x-build-id": "dGQaAGED6bemCNEKB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/api-empire~udemy-course-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-api-empire-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/api-empire~udemy-course-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-api-empire-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/api-empire~udemy-course-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-api-empire-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": {
          "courses": {
            "title": "🎓 Udemy Course URLs",
            "type": "array",
            "description": "📚 One or more Udemy course URLs.\n\n✅ Example: https://www.udemy.com/course/100-days-of-code/\n\n💡 Add several to collect reviews from many courses in one run. Course slugs and numeric course IDs also work here.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "🔗 Course URLs (legacy field)",
            "type": "array",
            "description": "🔁 Kept for backward compatibility with the original input format. Anything added here is merged with 🎓 Udemy Course URLs, so you can leave it empty.",
            "items": {
              "type": "string"
            }
          },
          "courseIdsOrSlugs": {
            "title": "🆔 Course Slugs or Numeric IDs",
            "type": "array",
            "description": "🧩 Optional second way to name a course when you do not have the full URL.\n\n✅ Example slug: 100-days-of-code\n✅ Example numeric ID: 2776760",
            "items": {
              "type": "string"
            }
          },
          "reviewLimit": {
            "title": "🔢 Max Reviews Per Course",
            "minimum": 0,
            "type": "integer",
            "description": "📈 How many matching reviews to collect for each course.\n\n⚡ Lower = faster runs. Set 0 to collect everything this source makes public (up to 10,000 reviews per course).\n\n💡 The count applies AFTER your filters, so 50 means 50 reviews that actually match."
          },
          "maxItems": {
            "title": "🎯 Max Reviews Per Course (legacy field)",
            "minimum": 1,
            "type": "integer",
            "description": "🔁 Kept for backward compatibility with the original input format. Used only when 🔢 Max Reviews Per Course is left empty.",
            "default": 10
          },
          "starRating": {
            "title": "⭐ Star Rating",
            "enum": [
              "any",
              "5",
              "4",
              "3",
              "2",
              "1"
            ],
            "type": "string",
            "description": "🎚️ Keep only reviews with the chosen star rating.\n\n✅ Example: pick 1 Star to pull only the complaints, or 5 Stars for testimonials.\n\n💡 One rating at a time - each bucket also includes its half-star reviews (choosing 4 Stars returns 4.0 and 4.5). Default is Any Rating."
          },
          "containsText": {
            "title": "🔎 Review Contains Keyword",
            "type": "string",
            "description": "🗣️ Keep only reviews whose text contains this word or phrase.\n\n✅ Example: refund, outdated, beginner, subtitles, support\n\n💡 Great for pulling every mention of a specific complaint or promise out of a huge course."
          },
          "excludeText": {
            "title": "🚫 Exclude Reviews Containing",
            "type": "array",
            "description": "🧹 Drop any review whose text contains one of these words or phrases (case-insensitive).\n\n✅ Example: [\\\"good\\\", \\\"nice course\\\"] to strip low-signal one-liners.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "🔀 Sort Reviews By",
            "enum": [
              "relevance",
              "newest",
              "oldest"
            ],
            "type": "string",
            "description": "📊 The order reviews are collected in - this decides WHICH reviews you get when you set a limit.\n\n✅ Relevance = the reviews the course page shows first.\n✅ Newest first = the most recent feedback.\n✅ Oldest first = the very first students.\n\n💡 Newest / Oldest also make the date window below exit as soon as it leaves the range."
          },
          "postedAfter": {
            "title": "📅 Posted After",
            "type": "string",
            "description": "⏳ Keep only reviews posted on or after this date.\n\n✅ Absolute example: 2026-01-01\n✅ Relative example: 3 months\n\n💡 Pair with Newest first for the fastest recent-feedback run."
          },
          "postedBefore": {
            "title": "📆 Posted Before",
            "type": "string",
            "description": "⏳ Keep only reviews posted on or before this date.\n\n✅ Absolute example: 2024-12-31\n✅ Relative example: 1 year\n\n💡 Combine with Posted After to study one specific period."
          },
          "includeRatingOnlyReviews": {
            "title": "🌟 Include Rating-Only Reviews",
            "type": "boolean",
            "description": "📥 Most Udemy students leave a star rating with no words at all, and those are normally left out.\n\n✅ Turn this ON to also receive the silent ratings (their content field is empty and isRatingOnly is true).\n\n💡 Needed if you want star counts that line up with the course's public rating breakdown. Default is OFF.",
            "default": false
          },
          "minReviewLength": {
            "title": "📏 Minimum Review Length",
            "minimum": 0,
            "type": "integer",
            "description": "✍️ Skip reviews shorter than this many characters.\n\n✅ Example: 120 keeps only detailed, substantive write-ups.\n\n💡 Set 0 to keep everything. Default is 0.",
            "default": 0
          },
          "includeAspectTags": {
            "title": "🏷️ Include Aspect Tags",
            "type": "boolean",
            "description": "🧾 Add six structured feedback columns to every review: aspectValuableInfo, aspectClearExplanations, aspectEngagingDelivery, aspectHelpfulPractice, aspectKnowledgeableInstructor, aspectAccurateDescription.\n\n✅ Each is yes, no, not-sure or empty.\n\n💡 Roughly 7 in 10 reviews carry these answers - the exact share for your run is reported as aspectCoveragePct. Default is ON.",
            "default": true
          },
          "includeReviewStage": {
            "title": "🚦 Include Review Stage",
            "type": "boolean",
            "description": "🧭 Add reviewStage, showing where in the course the student was when they wrote the review (start_of_course, mid_course, end_of_course, my_courses_page, dashboard).\n\n💡 A strong credibility signal - most Udemy reviews are written in the first minutes of a course. Default is ON.",
            "default": true
          },
          "emitCourseSummary": {
            "title": "📊 Add Per-Course Summary Row",
            "type": "boolean",
            "description": "🧮 Append one roll-up row per course (type = courseFeedbackSummary) with the percentage of yes answers for each of the six aspects, the honest aspectCoveragePct, and the review-stage mix.\n\n💡 Turn OFF for a dataset containing review rows only. Default is ON.",
            "default": true
          },
          "requestDelay": {
            "title": "⏳ Pacing Delay (seconds)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "🐢 How long to pause between steps while collecting a course.\n\n✅ Example: 2 for a gentler, steadier run.\n\n💡 Default is 1.",
            "default": 1
          },
          "concurrency": {
            "title": "⚡ Courses In Parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "🧵 How many courses to work on at the same time.\n\n✅ Example: 1 for the gentlest run, 5 for the fastest.\n\n💡 Default is 5.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy Configuration",
            "type": "object",
            "description": "🌐 Optional proxy settings for large or long-running batches.\n\n🟢 Default: no proxy. The run switches route automatically if it needs to."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}