# Coursera Reviews Scraper 🌟 (`0xrish/coursera-reviews-scraper`) Actor

Coursera Reviews Scraper extracts learner reviews, ratings, counts, and course summaries into a clean, structured format. Run this Apify actor to avoid manual copying and export data via dataset, API, schedules, webhooks, or integrations.

- **URL**: https://apify.com/0xrish/coursera-reviews-scraper.md
- **Developed by:** [Rishi](https://apify.com/0xrish) (community)
- **Categories:** Automation, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
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 Reviews Scraper

**Coursera Reviews Scraper** helps you collect **public learner reviews, ratings, review counts, and course-level summary information** from [Coursera](https://www.coursera.org/) in a clean, structured format. Instead of copying reviews manually, you can run this actor on Apify and export the data through the dataset, API, scheduled runs, webhooks, and integrations.

This actor is useful when you want to understand how learners feel about a course, compare different courses, monitor new feedback over time, or send Coursera review data into spreadsheets, BI tools, or internal dashboards. It also extracts the top-level course or specialization summary so you can see the headline stats without manually opening each Coursera page.

If you are new to Apify, the simplest way to try it is:

1. Open the actor.
2. Paste a Coursera course or specialization URL into the Input tab.
3. Run the actor.
4. Open the Output tab and download the results.

### Why use Coursera Reviews Scraper?

This actor is designed for people who want Coursera review data in a repeatable and easy-to-use format.

Common use cases:

- **Course research**: understand learner satisfaction before choosing, promoting, or benchmarking a course.
- **Market analysis**: compare review quality, volume, and sentiment across multiple courses or specializations.
- **Trend monitoring**: run the actor on a schedule to watch how ratings and feedback change over time.
- **Content strategy**: find common praise, complaints, and expectations from real learners.
- **Reporting and automation**: send results to Google Sheets, Make, Zapier, APIs, or internal reporting tools.

Because it runs on Apify, you also get:

- API access for automated workflows
- scheduling for recurring runs
- monitoring and run history
- integration support
- optional proxy handling when needed

### How to use Coursera Reviews Scraper

#### Quick start

1. Open the actor in Apify Console.
2. Go to the **Input** tab.
3. Enter one Coursera URL with `courseUrl`, or provide multiple URLs with `startUrls`.
4. Set the maximum number of reviews you want.
5. Optionally filter by stars, change the sort order, or add delays.
6. Click **Start**.
7. After the run finishes, open the **Output** tab to view or download the data.

#### What URLs work best?

This actor works best with public Coursera pages such as:

- `https://www.coursera.org/learn/some-course`
- `https://www.coursera.org/learn/some-course/reviews`
- `https://www.coursera.org/specializations/some-specialization`

If you provide a course URL, the actor will use its reviews page automatically.

#### One URL or multiple URLs?

Use `courseUrl` when you want to scrape **one** course or specialization.

Use `startUrls` when you want to scrape **multiple** Coursera pages in one run.

If both are provided, you should treat `startUrls` as your main multi-URL input.

### Input

Set everything in the actor's **Input** tab. You do not need any coding knowledge to use it.

#### Main input fields

| Field | Required | What it does |
| --- | --- | --- |
| `courseUrl` | No | A single public Coursera course or specialization URL |
| `startUrls` | No | A list of public Coursera URLs if you want to scrape multiple pages in one run |
| `maxReviews` | No | Maximum number of reviews to collect per source URL |
| `maxConcurrency` | No | Number of requests processed in parallel |
| `startPage` | No | Page number where review scraping should begin |
| `filterByStars` | No | Only keep reviews with selected star ratings |
| `sortBy` | No | Sort output reviews by helpfulness, date, or rating |
| `minDelayMs` | No | Minimum delay between paginated review requests |
| `maxDelayMs` | No | Maximum delay between paginated review requests |
| `includeStats` | No | Save a summary record with course-level information |
| `proxyConfiguration` | No | Optional Apify proxy settings |

#### Recommended defaults

If you are not sure what to use:

- set `maxReviews` to `100`
- keep `startPage` at `1`
- leave `filterByStars` empty to collect all reviews
- use `sortBy` as `mostHelpful`
- keep `includeStats` as `true`

#### Example input for one course

```json
{
  "courseUrl": "https://www.coursera.org/learn/learn-typescript/reviews",
  "maxReviews": 100,
  "startPage": 1,
  "sortBy": "mostHelpful",
  "minDelayMs": 1000,
  "maxDelayMs": 3000,
  "includeStats": true
}
````

#### Example input for multiple URLs

```json
{
  "startUrls": [
    { "url": "https://www.coursera.org/learn/learn-typescript" },
    { "url": "https://www.coursera.org/learn/python" },
    { "url": "https://www.coursera.org/specializations/prompt-engineering" }
  ],
  "maxReviews": 50,
  "filterByStars": ["4", "5"],
  "sortBy": "newest",
  "includeStats": true
}
```

#### How to choose the right settings

- Use `maxReviews` to control how much data you collect and how long the run takes.
- Use `filterByStars` if you only want positive reviews, critical reviews, or a specific rating range.
- Use `startPage` when you want to start deeper in the review list.
- Use `sortBy` when you want the exported review order to fit your workflow.
- Use `includeStats` when you want a course-level summary in addition to individual reviews.
- Use delays if you want more conservative request pacing.

### Output

The actor produces two main kinds of useful output:

1. **Course summary records** when `includeStats` is enabled
2. **Individual review records** in the dataset

When `includeStats` is enabled, the actor writes the final `COURSE_STATS` record **first** in the dataset for each source URL, followed by the matching `REVIEW` rows. This makes it easier to read the dataset top-down and immediately see the headline numbers before the raw reviews.

The summary record is built from the Coursera course or specialization page and from the scraped reviews themselves. That means the output can include:

- overall rating shown by Coursera
- total ratings and total reviews shown on Coursera
- enrolled count when visible
- course count for specializations when visible
- calculated review stats from the reviews collected in the current run

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

#### Review record example

```json
{
  "type": "REVIEW",
  "sourceUrl": "https://www.coursera.org/learn/learn-typescript/reviews",
  "reviewsUrl": "https://www.coursera.org/learn/learn-typescript/reviews",
  "courseName": "Learn TypeScript",
  "reviewerName": "Jane Doe",
  "rating": 5,
  "reviewText": "Excellent course with very clear explanations.",
  "reviewedAt": "2024-04-12",
  "helpfulVotes": 7,
  "productCompleted": null
}
```

#### Course summary example

```json
{
  "type": "COURSE_STATS",
  "courseName": "Foundations: Data, Data, Everywhere by Google",
  "averageRating": 4.8,
  "totalRatings": 121854,
  "totalReviews": 10000,
  "scrapedAt": "2026-04-09T00:18:29.118Z",
  "sourceUrl": "https://www.coursera.org/learn/foundations-data",
  "courseUrl": "https://www.coursera.org/learn/foundations-data/reviews",
  "scrapedReviewStats": {
    "totalReviews": 100,
    "averageRating": 4.29,
    "ratingDistribution": {
      "1": 12,
      "2": 4,
      "3": 5,
      "4": 1,
      "5": 78
    },
    "reviewsWithText": 100,
    "completedCourse": 0,
    "dateRange": {
      "newest": "2025-09-01",
      "oldest": "2021-03-11"
    }
  },
  "totalEnrolled": 83914577,
  "courseCount": null,
  "metadata": {
    "url": "https://www.coursera.org/learn/foundations-data",
    "title": "Foundations: Data, Data, Everywhere",
    "provider": "Google",
    "instructor": "Google Career Certificates",
    "level": "Beginner level",
    "duration": null,
    "weeklyHours": "at 10 hours a week",
    "ratingFromPage": null,
    "reviewCountFromPage": null,
    "enrolledCount": 83914577,
    "courseCount": null
  }
}
```

#### What each output type means

- `REVIEW`: one learner review entry
- `COURSE_STATS`: one summary record for the course or specialization you scraped
- `MISSING_REVIEW_SECTION`: a notice that the provided page did not expose a review section the actor could scrape

#### Where to find summary data

- In the **dataset**: the `COURSE_STATS` item is written before the review items for that source URL
- In the **key-value store**: the actor also saves summary records under `COURSE_STATS`
- In `metadata`: page-level course information such as title, provider, instructor, level, and enrollment details when available

### Data table

#### Review fields

| Field | Description |
| --- | --- |
| `type` | Record type, usually `REVIEW` for learner reviews |
| `sourceUrl` | The original URL you asked the actor to scrape |
| `reviewsUrl` | The Coursera reviews page used for review extraction |
| `courseName` | Course title when available |
| `reviewerName` | Name shown on the review |
| `rating` | Star rating from 1 to 5 |
| `reviewText` | Full review text when available |
| `reviewedAt` | Review date, usually in `YYYY-MM-DD` format when parseable |
| `helpfulVotes` | Helpful count shown on the review |
| `productCompleted` | Completion indicator if visible on the page |

#### Summary fields

| Field | Description |
| --- | --- |
| `averageRating` | Overall rating shown by Coursera |
| `totalRatings` | Total ratings shown on the page |
| `totalReviews` | Total reviews shown on the page |
| `totalEnrolled` | Enrolled learner count when available |
| `courseCount` | Number of courses in a specialization when available |
| `scrapedReviewStats.totalReviews` | Number of reviews actually collected in this run |
| `scrapedReviewStats.averageRating` | Average rating calculated from collected reviews |
| `scrapedReviewStats.ratingDistribution` | Count of 1-star to 5-star reviews collected |
| `scrapedReviewStats.reviewsWithText` | How many collected reviews included text |
| `scrapedReviewStats.dateRange` | Oldest and newest review dates found in this run |
| `metadata.url` | The course or specialization page used for metadata extraction |
| `metadata.provider` | Provider shown on the Coursera page when available |
| `metadata.instructor` | Instructor or issuing organization shown on the page when available |
| `metadata.level` | Level label such as Beginner, Intermediate, or Advanced when available |
| `metadata.enrolledCount` | Enrollment count shown on the page when available |

### Pricing / Cost estimation

How much does it cost to scrape Coursera reviews? This actor is designed to be priced by **review records collected**.

The intended charging model is:

- charge for the `Review` event for each review collected
- keep the small `apify-actor-start` charge enabled
- do **not** rely on charging `COURSE_STATS` summary rows as billable review units

Your cost mainly depends on:

- how many URLs you scrape
- how many review pages each URL has
- the `maxReviews` limit you choose
- whether you run it once or on a schedule
- whether you use proxies

To keep costs lower:

- scrape only the URLs you need
- reduce `maxReviews`
- avoid unnecessary repeated runs
- keep `includeStats` on only if you need the summary output

If you are testing the actor for the first time, start with one course and a small `maxReviews` limit such as `20` or `50`.

If you publish this actor with pay-per-event monetization, configure the pricing around the custom `Review` event so the billing matches the number of reviews collected.

### Tips or Advanced options

- Use `filterByStars` to create separate runs for positive and negative reviews.
- Use `startUrls` when comparing multiple courses in one run.
- Use scheduled runs if you want to monitor rating changes over time.
- Use `COURSE_STATS` output if your workflow needs a quick summary rather than every review.
- Read the first dataset item first if you want the top summary before processing review rows.
- Use the dataset export if you want to open the results directly in Excel or Google Sheets.
- Start with a direct course URL if a specialization page gives broader results than you want.

### FAQ, disclaimers, and support

#### Does this actor scrape private data?

No. It is intended for **publicly accessible Coursera review pages** only.

#### What if I do not get any reviews?

Possible reasons include:

- the page has no visible review section
- the URL is not a supported Coursera course or specialization page
- Coursera changed the page layout

If no review section is found, the actor may return a `MISSING_REVIEW_SECTION` notice.

#### Can I use this for many courses?

Yes. Use `startUrls` to pass multiple Coursera URLs in one run.

#### Is it legal to scrape Coursera?

You are responsible for making sure your use complies with Coursera's terms and all applicable laws, regulations, and internal policies.

#### Where do I ask for help?

Use the **Issues** tab on Apify Store for support or feedback. If you need a custom export, different workflow, or broader education-data solution, this actor can also be extended for that use case.

# Actor input Schema

## `startUrls` (type: `array`):

One or more Coursera course or specialization URLs.

## `courseUrl` (type: `string`):

Optional backward-compatible single URL field. If startUrls is provided, this field is ignored.

## `maxReviews` (type: `integer`):

Maximum number of reviews to collect for each input URL.

## `maxConcurrency` (type: `integer`):

How many review pages to scrape in parallel across all URLs. Higher values are faster but place more load on the site.

## `startPage` (type: `integer`):

Page number to start scraping from. Review pages use the ?page=N parameter.

## `filterByStars` (type: `array`):

Optional list of allowed star ratings. Leave empty to include all reviews.

## `sortBy` (type: `string`):

How to sort each streamed review batch before it is written to the dataset.

## `includeStats` (type: `boolean`):

Include a COURSE\_STATS summary record for each input URL.

## `minDelayMs` (type: `integer`):

Minimum delay between paginated review requests. Use 0 for maximum speed.

## `maxDelayMs` (type: `integer`):

Maximum random delay in milliseconds between page requests.

## `proxyConfiguration` (type: `object`):

Optional proxy settings for more reliable collection.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.coursera.org/specializations/prompt-engineering"
    },
    {
      "url": "https://www.coursera.org/learn/machine-learning"
    }
  ],
  "courseUrl": "https://www.coursera.org/learn/machine-learning",
  "maxReviews": 100,
  "maxConcurrency": 8,
  "startPage": 1,
  "filterByStars": [
    "4",
    "5"
  ],
  "sortBy": "mostHelpful",
  "includeStats": true,
  "minDelayMs": 0,
  "maxDelayMs": 250
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.coursera.org/specializations/prompt-engineering"
        },
        {
            "url": "https://www.coursera.org/learn/machine-learning"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("0xrish/coursera-reviews-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 = { "startUrls": [
        { "url": "https://www.coursera.org/specializations/prompt-engineering" },
        { "url": "https://www.coursera.org/learn/machine-learning" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("0xrish/coursera-reviews-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 '{
  "startUrls": [
    {
      "url": "https://www.coursera.org/specializations/prompt-engineering"
    },
    {
      "url": "https://www.coursera.org/learn/machine-learning"
    }
  ]
}' |
apify call 0xrish/coursera-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Coursera Reviews Scraper 🌟",
        "description": "Coursera Reviews Scraper extracts learner reviews, ratings, counts, and course summaries into a clean, structured format. Run this Apify actor to avoid manual copying and export data via dataset, API, schedules, webhooks, or integrations.",
        "version": "0.0",
        "x-build-id": "gxp3gpdwoZfVRLKCT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/0xrish~coursera-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-0xrish-coursera-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/0xrish~coursera-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-0xrish-coursera-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/0xrish~coursera-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-0xrish-coursera-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "One or more Coursera course or specialization URLs.",
                        "default": [
                            {
                                "url": "https://www.coursera.org/specializations/prompt-engineering"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "courseUrl": {
                        "title": "Single Course URL",
                        "type": "string",
                        "description": "Optional backward-compatible single URL field. If startUrls is provided, this field is ignored."
                    },
                    "maxReviews": {
                        "title": "Max Reviews Per URL",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to collect for each input URL.",
                        "default": 100
                    },
                    "maxConcurrency": {
                        "title": "Parallel Requests",
                        "minimum": 1,
                        "maximum": 32,
                        "type": "integer",
                        "description": "How many review pages to scrape in parallel across all URLs. Higher values are faster but place more load on the site.",
                        "default": 8
                    },
                    "startPage": {
                        "title": "Start Page",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Page number to start scraping from. Review pages use the ?page=N parameter.",
                        "default": 1
                    },
                    "filterByStars": {
                        "title": "Filter by Star Rating",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional list of allowed star ratings. Leave empty to include all reviews.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ]
                        },
                        "default": []
                    },
                    "sortBy": {
                        "title": "Sort Reviews By",
                        "enum": [
                            "mostHelpful",
                            "newest",
                            "oldest",
                            "highestRated",
                            "lowestRated"
                        ],
                        "type": "string",
                        "description": "How to sort each streamed review batch before it is written to the dataset.",
                        "default": "mostHelpful"
                    },
                    "includeStats": {
                        "title": "Include Summary Statistics",
                        "type": "boolean",
                        "description": "Include a COURSE_STATS summary record for each input URL.",
                        "default": true
                    },
                    "minDelayMs": {
                        "title": "Min Delay Between Pages (ms)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum delay between paginated review requests. Use 0 for maximum speed.",
                        "default": 0
                    },
                    "maxDelayMs": {
                        "title": "Max Delay Between Pages (ms)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum random delay in milliseconds between page requests.",
                        "default": 250
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Optional proxy settings for more reliable collection."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
