# Udemy Search Spider (`getdataforme/udemy-search-spider`) Actor

Automate course data extraction from Udemy with customizable search queries and flexible item limits. Ideal for market research, competitive analysis, and content aggregation, it provides structured JSON output for easy integration....

- **URL**: https://apify.com/getdataforme/udemy-search-spider.md
- **Developed by:** [GetDataForMe](https://apify.com/getdataforme) (community)
- **Categories:** AI, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

---

## Udemy Search Spider

### Introduction

The Udemy Search Spider is a powerful tool designed to automate the search and extraction of course data from Udemy. It allows users to efficiently gather detailed information about courses based on specific queries, making it invaluable for market research, competitive analysis, and content aggregation.

### Features

- **Automated Course Data Extraction**: Seamlessly scrape course details such as title, instructor, ratings, and more.
- **Customizable Search Queries**: Tailor searches with specific keywords to find relevant courses.
- **Flexible Item Limits**: Set a maximum number of items to scrape per run or opt for unlimited extraction.
- **High-Quality Data Output**: Receive structured JSON data that is easy to analyze and integrate.
- **User-Friendly Configuration**: Simple setup with intuitive input parameters for quick customization.

### Input Parameters

| Parameter     | Type    | Required | Description                                                                 | Example          |
|---------------|---------|----------|-----------------------------------------------------------------------------|------------------|
| SearchQuery   | string  | No       | The search query for the spider.                                             | `"hacking"`      |
| item_limit    | integer | No       | Maximum items to scrape per actor run. Set to 0 for no limit.                | `10`             |

### Example Usage

#### Input JSON
```json
{
  "SearchQuery": "hacking",
  "item_limit": 10
}
````

#### Output JSON

```json
[
  {
    "id": "857010",
    "title": "Learn Ethical Hacking From Scratch",
    "headline": "Become an ethical hacker that can hack like black hat hackers and secure systems like cybersecurity experts",
    "instructors": [
      "Zaid Sabih",
      "z Security"
    ],
    "rating": 4.552799701690674,
    "rating_count": 136707,
    "duration_in_seconds": 54224,
    "enrollments": 600000,
    "primary_topic": "Ethical Hacking",
    "images": {
      "__typename": "CourseImages",
      "px480x270": "https://img-c.udemycdn.com/course/480x270/857010_8239_5.jpg",
      "px75x75": "https://img-c.udemycdn.com/course/75x75/857010_8239_5.jpg"
    },
    "badges": [
      "Bestseller",
      "Bestseller"
    ],
    "search_query": "hacking",
    "actor_id": "85NDcJYmjBRyB46UZ",
    "run_id": "p37tWdsSX2qkpC3Ww"
  },
  {
    "id": "3291970",
    "title": "Complete Ethical Hacking Bootcamp",
    "headline": "Learn Ethical Hacking + Penetration Testing! Use real techniques by black hat hackers then learn to defend against them!",
    "instructors": [
      "Andrei Neagoie",
      "Aleksa Tamburkovski"
    ],
    "rating": 4.634065628051758,
    "rating_count": 19190,
    "duration_in_seconds": 103499,
    "enrollments": 100000,
    "primary_topic": "Ethical Hacking",
    "images": {
      "__typename": "CourseImages",
      "px480x270": "https://img-c.udemycdn.com/course/480x270/3291970_afb5_2.jpg",
      "px75x75": "https://img-c.udemycdn.com/course/75x75/3291970_afb5_2.jpg"
    },
    "badges": [],
    "search_query": "hacking",
    "actor_id": "85NDcJYmjBRyB46UZ",
    "run_id": "p37tWdsSX2qkpC3Ww"
  }
]
```

### Use Cases

- **Market Research and Analysis**: Identify trending courses and topics.
- **Competitive Intelligence**: Monitor competitor offerings and strategies.
- **Price Monitoring**: Track course pricing changes over time.
- **Content Aggregation**: Compile comprehensive lists of courses for analysis or recommendation.
- **Academic Research**: Gather data for studies on online education trends.
- **Business Automation**: Integrate with systems to automate content updates.

### Installation and Usage

1. Search for "Udemy Search Spider" in the Apify Store.
2. Click "Try for free" or "Run".
3. Configure input parameters as needed.
4. Click "Start" to begin extraction.
5. Monitor progress in the log.
6. Export results in your preferred format (JSON, CSV, Excel).

### Output Format

The output is a JSON array of course objects, each containing:

- `id`: Unique identifier for the course.
- `title`: Course title.
- `headline`: Brief description of the course.
- `instructors`: List of instructors.
- `rating`: Average rating of the course.
- `rating_count`: Number of ratings received.
- `duration_in_seconds`: Total duration in seconds.
- `enrollments`: Number of enrollments.
- `primary_topic`: Main topic of the course.
- `images`: URLs to course images.
- `badges`: List of badges associated with the course.
- `search_query`: The search query used.
- `actor_id`: Identifier for the actor run.
- `run_id`: Unique identifier for the run.

### Error Handling

The Udemy Search Spider is designed to handle common errors gracefully. If an error occurs, such as a network issue or invalid input, the spider will log detailed information in the Apify console. Users can review these logs to diagnose and resolve issues. For persistent problems, contact support with specific details from the logs.

### Rate Limiting and Best Practices

- **Rate Limiting**: The spider adheres to Udemy's rate limits to prevent being blocked. Ensure your `item_limit` is set appropriately to avoid excessive requests.
- **Best Practices**: Use specific search queries to reduce unnecessary data extraction. Monitor performance in the Apify console and adjust settings as needed for optimal results.

### Limitations and Considerations

- The spider relies on Udemy's public-facing website, which may change without notice, potentially affecting functionality.
- Ensure compliance with Udemy's terms of service when using this tool.
- Data accuracy is subject to changes made by Udemy after the extraction process.

# Actor input Schema

## `SearchQuery` (type: `string`):

The search query for the spider.

## `item_limit` (type: `integer`):

Maximum items to scrape per actor run. Set to 0 for no limit.

## Actor input object example

```json
{
  "SearchQuery": "hacking",
  "item_limit": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Scraped data items from dataset

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("getdataforme/udemy-search-spider").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("getdataforme/udemy-search-spider").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call getdataforme/udemy-search-spider --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=getdataforme/udemy-search-spider",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Udemy Search Spider",
        "description": "Automate course data extraction from Udemy with customizable search queries and flexible item limits. Ideal for market research, competitive analysis, and content aggregation, it provides structured JSON output for easy integration....",
        "version": "0.0",
        "x-build-id": "nvo90ecJmgELu00hM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/getdataforme~udemy-search-spider/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-getdataforme-udemy-search-spider",
                "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/getdataforme~udemy-search-spider/runs": {
            "post": {
                "operationId": "runs-sync-getdataforme-udemy-search-spider",
                "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/getdataforme~udemy-search-spider/run-sync": {
            "post": {
                "operationId": "run-sync-getdataforme-udemy-search-spider",
                "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": {
                    "SearchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "The search query for the spider.",
                        "default": "hacking"
                    },
                    "item_limit": {
                        "title": "Item limit",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum items to scrape per actor run. Set to 0 for no limit.",
                        "default": 10
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
