# Coursera Course Scraper (`automation-lab/coursera-course-scraper`) Actor

Extract Coursera courses — titles, descriptions, difficulty levels, partners, certificates, and domains. Search by keyword, category, or scrape the full catalog. No proxy needed.

- **URL**: https://apify.com/automation-lab/coursera-course-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Education
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Coursera Course Scraper

### What does Coursera Course Scraper do?

**Coursera Course Scraper** extracts detailed course data from [Coursera](https://www.coursera.org) — the world's largest online learning platform with 20,000+ courses from top universities and companies. Using Coursera's public REST API, this actor fetches course titles, descriptions, difficulty levels, partner/university details, certificate types, domain categories, workloads, and direct course URLs — all without any login or API key.

Search by keyword, browse by domain category, or extract all courses in bulk. Perfect for building course directories, conducting education market research, or analyzing online learning trends. No browser, no proxy — pure API access means fast, reliable, and extremely cost-effective extraction.

### Who is it for?

**📊 Education researchers and data analysts**
- Analyze course distribution across difficulty levels and domains
- Track which universities and companies offer the most online courses
- Study language availability and global education access
- Build datasets for academic research on online learning trends

**🏢 HR and learning & development professionals**
- Inventory available courses for employee skill development programs
- Compare course offerings across providers for procurement decisions
- Identify certification programs aligned with company skills gaps
- Monitor new course launches in your industry

**🛠️ Developers and product teams**
- Build course recommendation engines or comparison platforms
- Populate content databases for educational apps and portals
- Create automated alerts for new courses in specific domains
- Aggregate Coursera data with other education platform data

**📈 Competitive intelligence and market researchers**
- Map the online education landscape by domain and provider
- Analyze pricing and certificate offerings across platforms
- Identify underserved subject areas with few course offerings
- Track Coursera's catalog growth over time

### Why use Coursera Course Scraper?

- ✅ **No API key or login required** — Coursera's public API is freely accessible
- ✅ **No proxy needed** — pure HTTP API calls, no browser overhead
- ✅ **Fast and reliable** — direct API calls, not HTML scraping
- ✅ **Flexible search modes** — by keyword, by domain category, or all courses
- ✅ **Rich partner data** — fetches university/company names, logos, and descriptions
- ✅ **Multi-filter support** — filter by language, difficulty level, and certificate type
- ✅ **Complete coverage** — access all 20,000+ courses on Coursera
- ✅ **Apify platform** — schedule runs, export as JSON/CSV/Excel, integrate with 5,000+ apps

### What data can you extract?

| Field | Description |
|-------|-------------|
| `name` | Full course title |
| `slug` | URL slug for the course |
| `url` | Direct link to the course on Coursera |
| `description` | Full course description |
| `courseType` | Course format (on-demand, etc.) |
| `level` | Difficulty level (BEGINNER/INTERMEDIATE/ADVANCED/MIXED) |
| `workload` | Estimated time to complete |
| `primaryLanguages` | Languages the course is taught in |
| `subtitleLanguages` | Available subtitle languages |
| `certificates` | Certificate types (VerifiedCert, Specialization, etc.) |
| `photoUrl` | Course thumbnail image URL |
| `domainId` | Primary domain category (e.g., data-science) |
| `subdomainId` | Primary subdomain category |
| `allDomains` | All domain/subdomain pairs |
| `partnerName` | University or company offering the course |
| `partnerShortName` | Short/abbreviated partner name |
| `partnerDescription` | Description of the partner institution |
| `partnerLogo` | Partner institution logo URL |
| `partnerIds` | Partner institution IDs |
| `specializations` | Specialization program IDs |

### How much does it cost to scrape Coursera courses?

Coursera Course Scraper uses **Pay-Per-Event (PPE) pricing** with tiered discounts for higher Apify plans:

| Plan | Start fee | Per course | 100 courses | 1,000 courses |
|------|-----------|------------|-------------|---------------|
| Free | $0.005 | $0.00115 | $0.12 | $1.15 |
| Starter (BRONZE) | $0.005 | $0.001 | $0.10 | $1.00 |
| Scale (SILVER) | $0.004 | $0.00078 | $0.08 | $0.78 |
| Business (GOLD) | $0.003 | $0.0006 | $0.06 | $0.60 |
| Business+ (PLATINUM) | $0.003 | $0.0004 | $0.04 | $0.40 |
| Enterprise (DIAMOND) | $0.002 | $0.00028 | $0.03 | $0.28 |

💡 **Free plan estimate**: Apify gives $5 in free credits. That's enough to extract **~4,000 courses** on the free plan — more than enough to explore the full Coursera catalog by category.

This actor is extremely cheap to run because it uses direct API calls with no browser or proxy costs.

### How to scrape Coursera courses

1. Go to the [Coursera Course Scraper](https://apify.com/automation-lab/coursera-course-scraper) page on Apify Store
2. Click **Try for free**
3. Choose a **Search mode**:
   - **Keyword search** — enter a search term (e.g., "machine learning")
   - **Category/domain browse** — select a domain like "Data Science"
   - **All courses** — scrape all 20,000+ courses with optional filters
4. Set **Maximum courses** to control how many to extract
5. Optionally filter by **language**, **difficulty level**, or **certificate type**
6. Click **Start** and wait for results
7. Download results as JSON, CSV, or Excel

**Input examples:**

Keyword search for Python courses:
```json
{
  "searchMode": "keyword",
  "searchQuery": "python",
  "maxResults": 100,
  "language": "en"
}
````

Browse beginner Data Science courses:

```json
{
  "searchMode": "category",
  "category": "data-science",
  "maxResults": 50,
  "difficultyLevel": "BEGINNER"
}
```

Extract all courses with certificates:

```json
{
  "searchMode": "all",
  "maxResults": 5000,
  "certificateType": "VerifiedCert"
}
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchMode` | String | Yes | `keyword` | How to find courses: `keyword`, `category`, or `all` |
| `searchQuery` | String | When mode=keyword | — | Keyword to search in course names and descriptions |
| `category` | String | When mode=category | — | Domain category (e.g., `data-science`, `business`) |
| `maxResults` | Integer | Yes | 50 | Maximum number of courses to extract (1–10,000) |
| `language` | String | No | — | ISO 639-1 language code (e.g., `en`, `es`, `zh`) |
| `difficultyLevel` | String | No | — | `BEGINNER`, `INTERMEDIATE`, `ADVANCED`, or `MIXED` |
| `certificateType` | String | No | — | `VerifiedCert`, `Specialization`, or `ProfessionalCertificate` |
| `includePartnerDetails` | Boolean | No | `true` | Fetch full partner/university details (name, description, logo) |

**Available categories:**
`arts-and-humanities`, `business`, `computer-science`, `data-science`, `information-technology`, `life-sciences`, `math-and-logic`, `personal-development`, `physical-science-and-engineering`, `social-sciences`, `language-learning`

### Output examples

```json
{
  "id": "iGYdtQA7EfGQkhLpkq4N-Q",
  "name": "Unlock Multimodal Search",
  "slug": "unlock-multimodal-search",
  "url": "https://www.coursera.org/learn/unlock-multimodal-search",
  "description": "\"Unlock Multimodal Search\" is an intermediate, hands-on course for developers and ML engineers...",
  "courseType": "v2.ondemand",
  "level": "INTERMEDIATE",
  "workload": "Approximately 91 minutes",
  "primaryLanguages": ["en"],
  "subtitleLanguages": [],
  "certificates": ["VerifiedCert", "Specialization"],
  "photoUrl": "https://d3njjcbhbojbot.cloudfront.net/api/...",
  "domainId": "information-technology",
  "subdomainId": "data-management",
  "allDomains": [
    {"domainId": "information-technology", "subdomainId": "data-management"},
    {"domainId": "data-science", "subdomainId": "machine-learning"}
  ],
  "partnerIds": ["1342"],
  "partnerName": "Coursera",
  "partnerShortName": "coursera",
  "partnerDescription": "Coursera brings together a diverse network of subject matter experts...",
  "partnerLogo": "https://d3njjcbhbojbot.cloudfront.net/api/...",
  "specializations": [],
  "scrapedAt": "2026-04-08T03:00:00.000Z"
}
```

### Tips for best results

- 🚀 **Start small** — test with `maxResults: 20` first to verify your filters work correctly
- 🔍 **Keyword matching** — keywords are matched against course names and descriptions, so use specific terms for better results
- 🌍 **Language codes** — use ISO 639-1 codes: `en` (English), `es` (Spanish), `zh` (Chinese), `fr` (French), `de` (German), `pt` (Portuguese), `ja` (Japanese)
- 📦 **Bulk extraction** — for full catalog extraction, use `searchMode: "all"` with `maxResults: 10000` and apply filters to narrow results
- 🔄 **Schedule runs** — use Apify's scheduler to monitor the Coursera catalog for new courses in your area of interest
- 💡 **Partner details** — set `includePartnerDetails: false` to skip extra API calls if you only need basic course data (makes runs faster for large extractions)
- 📊 **Category browsing** — when using category mode, results include all levels by default — add `difficultyLevel` filter to target specific learner experience levels

### Integrations

**Coursera data → Google Sheets** — Build a live course catalog spreadsheet for your team:
Set up a scheduled run (weekly) to extract new `computer-science` courses → auto-export to Google Sheets → share with your L\&D team for training program planning.

**Coursera data → Slack/Discord alerts** — Monitor new course launches:
Schedule daily runs searching for `"AI"` or `"GenAI"` → compare with previous dataset → webhook to Slack when new courses appear in your domain.

**Coursera data → Make/Zapier workflows** — Automate course discovery:
Connect via Apify's webhook → Make scenario → add new courses to Notion database → trigger email digest to stakeholders.

**Coursera data → MongoDB/PostgreSQL** — Build a searchable course database:
Use `searchMode: "all"` with pagination → store in your database → build custom search and filtering on top of the data.

**Bulk export for analysis** — Research and reports:
Extract 5,000+ courses → export as CSV → import into Excel or Tableau for analysis of market trends, gap analysis, or competitive benchmarking.

### API usage

You can trigger Coursera Course Scraper via the [Apify API](https://docs.apify.com/api/v2):

#### Node.js

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('automation-lab/coursera-course-scraper').call({
    searchMode: 'keyword',
    searchQuery: 'machine learning',
    maxResults: 100,
    language: 'en',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("automation-lab/coursera-course-scraper").call(run_input={
    "searchMode": "category",
    "category": "data-science",
    "maxResults": 200,
    "difficultyLevel": "BEGINNER",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], "-", item["partnerName"])
```

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~coursera-course-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchMode": "keyword",
    "searchQuery": "python",
    "maxResults": 50
  }'
```

### Use with AI agents via MCP

Coursera Course Scraper is available as a tool for AI assistants that support the [Model Context Protocol (MCP)](https://docs.apify.com/platform/integrations/mcp).

Add the Apify MCP server to your AI client — this gives you access to all Apify actors, including this one:

#### Setup for Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com"
```

#### Setup for Claude Desktop, Cursor, or VS Code

Add this to your MCP config file:

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com"
        }
    }
}
```

Your AI assistant will use OAuth to authenticate with your Apify account on first use.

#### Example prompts

Once connected, try asking your AI assistant:

- "Use automation-lab/coursera-course-scraper to find all beginner Python courses on Coursera and export them to a spreadsheet"
- "Scrape the top 100 data science courses on Coursera and tell me which universities offer the most courses"
- "Find all Coursera courses in Spanish on personal development and list them with their workload and certificate types"

Learn more in the [Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp).

### Legality

This actor accesses Coursera's **public REST API** (`api.coursera.org`) which returns publicly available course catalog data — no login, authentication, or private data is involved. This is the same data visible to anyone browsing Coursera without an account.

Web scraping and API access of publicly available data is generally lawful and widely practiced for research, journalism, and commercial data aggregation purposes. However, always review Coursera's [Terms of Service](https://www.coursera.org/about/terms) for the latest guidance on data usage, and ensure your use case complies with applicable law including GDPR and CCPA.

**This actor does NOT:**

- Access user accounts, enrollment data, or private content
- Bypass authentication or rate limiting in a harmful way
- Extract paid course content or copyrighted materials

Always use scraped data responsibly and ethically.

### FAQ

**How fast does the scraper run?**
Very fast — since it uses direct API calls with no browser, it processes 100–500 courses per minute depending on filter complexity. A run extracting 1,000 courses typically completes in 2–3 minutes.

**How much does it cost to scrape 1,000 Coursera courses?**
About $1.00 on the Starter plan. With Apify's free $5 credit, you can extract ~4,000 courses. Higher Apify plans unlock volume discounts down to $0.28 per 1,000 courses.

**Does it compare with the official Coursera API?**
The official Coursera API requires manual application and approval from Coursera. This actor uses Coursera's freely accessible public REST API endpoints — no application needed, immediate access.

**Why are some courses missing descriptions?**
Some older courses on Coursera have empty or very short descriptions in the API. The `description` field may be blank for a small percentage of courses. This is a data quality issue on Coursera's end, not a scraper bug.

**Why is my keyword search returning unexpected results?**
Keyword matching is done against course names AND descriptions. A search for "python" will match courses where Python is mentioned in the description, not just those with "Python" in the title. For title-only matching, review and filter the results by the `name` field in post-processing.

**What if I get 0 results?**
Check that your keyword is spelled correctly and not too specific. Try using `searchMode: "all"` with a `language` or `difficultyLevel` filter to browse without keyword constraints. Coursera's catalog uses English-language slugs even for non-English courses.

### Related actors

Looking for more learning platform scrapers? Check out our other tools:

- [Udemy Scraper](https://apify.com/automation-lab/udemy-scraper) — Extract Udemy course listings, ratings, prices, and instructor data
- [ArXiv Scraper](https://apify.com/automation-lab/arxiv-scraper) — Scrape research papers from ArXiv with titles, authors, abstracts, and PDF links
- [AI Tools Directory Scraper](https://apify.com/automation-lab/ai-tools-directory-scraper) — Extract AI tool listings from major directories

# Actor input Schema

## `searchMode` (type: `string`):

Choose how to find courses: by keyword search, by category/domain, or scrape all courses.

## `searchQuery` (type: `string`):

Keyword to search for in course names and descriptions. Used when searchMode is 'keyword'.

## `category` (type: `string`):

Filter courses by Coursera domain category. Used when searchMode is 'category'.

## `maxResults` (type: `integer`):

Maximum number of courses to return. Higher numbers take longer.

## `language` (type: `string`):

Filter courses by primary language (ISO 639-1 code, e.g. 'en', 'es', 'zh', 'fr'). Leave empty for all languages.

## `difficultyLevel` (type: `string`):

Filter by course difficulty level.

## `certificateType` (type: `string`):

Filter by certificate type offered.

## `includePartnerDetails` (type: `boolean`):

Fetch full partner/university details (name, description, logo). Adds extra API calls.

## Actor input object example

```json
{
  "searchMode": "keyword",
  "searchQuery": "machine learning",
  "maxResults": 20,
  "includePartnerDetails": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "searchMode": "keyword",
    "searchQuery": "machine learning",
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/coursera-course-scraper").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 = {
    "searchMode": "keyword",
    "searchQuery": "machine learning",
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/coursera-course-scraper").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 '{
  "searchMode": "keyword",
  "searchQuery": "machine learning",
  "maxResults": 20
}' |
apify call automation-lab/coursera-course-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/coursera-course-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Coursera Course Scraper",
        "description": "Extract Coursera courses — titles, descriptions, difficulty levels, partners, certificates, and domains. Search by keyword, category, or scrape the full catalog. No proxy needed.",
        "version": "0.1",
        "x-build-id": "zvOYqVKMa1VNVeuwW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~coursera-course-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-coursera-course-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/automation-lab~coursera-course-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-coursera-course-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/automation-lab~coursera-course-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-coursera-course-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",
                "required": [
                    "searchMode",
                    "maxResults"
                ],
                "properties": {
                    "searchMode": {
                        "title": "🔍 Search mode",
                        "enum": [
                            "keyword",
                            "category",
                            "all"
                        ],
                        "type": "string",
                        "description": "Choose how to find courses: by keyword search, by category/domain, or scrape all courses.",
                        "default": "keyword"
                    },
                    "searchQuery": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Keyword to search for in course names and descriptions. Used when searchMode is 'keyword'."
                    },
                    "category": {
                        "title": "Category (domain)",
                        "enum": [
                            "arts-and-humanities",
                            "business",
                            "computer-science",
                            "data-science",
                            "information-technology",
                            "life-sciences",
                            "math-and-logic",
                            "personal-development",
                            "physical-science-and-engineering",
                            "social-sciences",
                            "language-learning"
                        ],
                        "type": "string",
                        "description": "Filter courses by Coursera domain category. Used when searchMode is 'category'."
                    },
                    "maxResults": {
                        "title": "Maximum courses to extract",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of courses to return. Higher numbers take longer.",
                        "default": 50
                    },
                    "language": {
                        "title": "Language filter",
                        "type": "string",
                        "description": "Filter courses by primary language (ISO 639-1 code, e.g. 'en', 'es', 'zh', 'fr'). Leave empty for all languages."
                    },
                    "difficultyLevel": {
                        "title": "Difficulty level",
                        "enum": [
                            "",
                            "BEGINNER",
                            "INTERMEDIATE",
                            "ADVANCED",
                            "MIXED"
                        ],
                        "type": "string",
                        "description": "Filter by course difficulty level."
                    },
                    "certificateType": {
                        "title": "Certificate type",
                        "enum": [
                            "",
                            "VerifiedCert",
                            "Specialization",
                            "ProfessionalCertificate"
                        ],
                        "type": "string",
                        "description": "Filter by certificate type offered."
                    },
                    "includePartnerDetails": {
                        "title": "Include full partner details",
                        "type": "boolean",
                        "description": "Fetch full partner/university details (name, description, logo). Adds extra API calls.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
