# Lazada Produc Scraper -SG, MY, PH, TH, VN, ID (`lentic_clockss/lazada-ph-search-results-collector`) Actor

Lazada Scraper With Reviews extracts structured product listing and customer review data from Lazada across MY, SG, ID, PH, TH, and VN. It captures titles, URLs, pricing, ratings, seller details, media assets, inventory signals, and review content in a consistent format for analytics, monitoring

- **URL**: https://apify.com/lentic\_clockss/lazada-ph-search-results-collector.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.90 / 1,000 result items

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

## Lazada  Produc Scraper -SG, MY, PH, TH, VN, ID

<p align="center">
  <img src="assets/lazada-readme-visual.svg" alt="Lazada Actor visual flow" width="100%" />
</p>

<p align="center">
  Browser-context Lazada search scraper for <b>SG, MY, PH, TH, VN, ID</b><br/>
  with <b>market-matched residential proxies</b>, <b>AJAX extraction</b>, and <b>debug-friendly output</b>.
</p>

<p align="center">
  <img alt="markets" src="https://img.shields.io/badge/Markets-SG%20%7C%20MY%20%7C%20PH%20%7C%20TH%20%7C%20VN%20%7C%20ID-0F172A?style=for-the-badge&logo=apify" />
  <img alt="output" src="https://img.shields.io/badge/Output-Dataset%20%2B%20RUN__SUMMARY-14532D?style=for-the-badge" />
  <img alt="proxy" src="https://img.shields.io/badge/Proxy-Residential%20Auto--Match-1D4ED8?style=for-the-badge" />
</p>

### Overview

Lazada  Produc Scraper -SG, MY, PH, TH, VN, ID is a multi-country Apify Actor for collecting **Lazada search result listings** from:

- Singapore (`SG`)
- Malaysia (`MY`)
- Philippines (`PH`)
- Thailand (`TH`)
- Vietnam (`VN`)
- Indonesia (`ID`)

The actor does **not** rely on brittle first-response HTML parsing as its primary data source. Instead, it opens the real Lazada search experience in a browser context, performs lightweight page warmup when needed, calls the site's structured AJAX endpoint, parses the JSON payload, and writes normalized records to the Apify dataset.

This design is especially useful when you care more about **correctness, observability, and market-specific compatibility** than maximum raw throughput.

### Why use this Actor

- **Market research:** Track search rankings, titles, prices, ratings, and seller signals across six Lazada markets.
- **Competitive monitoring:** Compare the same keyword across SG / MY / PH / TH / VN / ID using one consistent output contract.
- **Data pipelines:** Send normalized records directly into analytics workflows, dashboards, or downstream ETL jobs.
- **QA / debugging:** Persist `RUN_SUMMARY` and optional debug artifacts for easier troubleshooting.
- **Geo-sensitive collection:** When Apify Proxy is used, the actor automatically aligns the residential proxy country with the selected market.

### What makes this actor different

#### 1) Browser-context AJAX extraction
The actor loads Lazada in a real Playwright browser session and fetches the structured search payload from the in-page context. This is more robust than scraping unstable surface HTML only.

#### 2) Market-matched residential proxies
For Apify runs, the actor automatically resolves the proxy country from the selected market:

- `SG -> SG`
- `MY -> MY`
- `PH -> PH`
- `TH -> TH`
- `VN -> VN`
- `ID -> ID`

When Apify Proxy is used, the actor also enforces **`RESIDENTIAL`** proxy routing for the supported remote anti-bot path.

#### 3) Stricter TH / ID handling
For Thailand and Indonesia, the actor includes a **site-root warmup path** before search and a **punish recovery path** when needed. This improves stability on stricter storefronts without changing the output schema.

#### 4) Debug-friendly output
Each run can produce:

- dataset records
- `RUN_SUMMARY`
- `INPUT_ECHO`
- optional screenshots / HTML / payload metadata in debug mode

### Supported markets

| Market | Country | Host |
| --- | --- | --- |
| `SG` | Singapore | `www.lazada.sg` |
| `MY` | Malaysia | `www.lazada.com.my` |
| `PH` | Philippines | `www.lazada.com.ph` |
| `TH` | Thailand | `www.lazada.co.th` |
| `VN` | Vietnam | `www.lazada.vn` |
| `ID` | Indonesia | `www.lazada.co.id` |

### Input

#### Main input fields

| Field | Type | Description | Default |
| --- | --- | --- | --- |
| `keywords` | `string[]` | Search keywords. Empty or whitespace-only values are removed before validation. | Required |
| `market` | `string` | Target Lazada market: `PH`, `SG`, `MY`, `TH`, `VN`, `ID`. | `PH` |
| `pages` | `integer` | Search result pages per keyword. | `1` |
| `maxItems` | `integer` | Maximum normalized rows written after dedupe. | `40` |
| `minItemsPerPage` | `integer` | Minimum accepted items per parsed AJAX payload. | `1` |
| `headless` | `boolean` | Run browser headless. | `true` |
| `includeRawPayload` | `boolean` | Save raw AJAX payloads to KVS. | `false` |
| `debug` | `boolean` | Save extra debug evidence on failures. | `false` |
| `proxyConfiguration` | `object` | Apify Proxy or custom proxy config. | `null` |
| `maxRetriesPerKeyword` | `integer` | Recoverable retry attempts per keyword. | `1` |
| `requestTimeoutSecs` | `integer` | Timeout budget per keyword. | `90` |
| `scrollSteps` | `integer` | Light scroll steps before AJAX fetch. | `3` |
| `scrollDelayMs` | `integer` | Delay between scroll steps. | `300` |
| `postLoadWaitMs` | `integer` | Extra wait after page load. | `1200` |

#### Example input

```json
{
  "keywords": ["phone case", "wireless earbuds"],
  "market": "TH",
  "pages": 1,
  "maxItems": 20,
  "minItemsPerPage": 1,
  "headless": true,
  "includeRawPayload": false,
  "debug": false,
  "maxRetriesPerKeyword": 1,
  "requestTimeoutSecs": 90,
  "scrollSteps": 3,
  "scrollDelayMs": 300,
  "postLoadWaitMs": 1200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
````

### Output

The actor writes normalized records to the Apify dataset.

#### Core fields

- `keyword`
- `market`
- `marketName`
- `country`
- `page`
- `rank`
- `absoluteRank`
- `itemId`
- `skuId`
- `title`
- `productUrl`
- `sourceUrl`
- `image`
- `price`
- `currency`
- `currencyCode`
- `capturedAt`
- `source`

#### Extended fields

- `sellerName`
- `originalPrice`
- `discount`
- `ratingScore`
- `reviewCount`
- `soldText`
- `location`
- `marketHost`
- `searchUrl`
- `ajaxUrl`
- `responseUrl`
- `responseStatus`
- `pageType`

#### Example output

```json
{
  "keyword": "phone case",
  "market": "ID",
  "marketName": "Indonesia",
  "country": "ID",
  "page": 1,
  "rank": 1,
  "absoluteRank": 1,
  "itemId": "8777376072",
  "skuId": "16222892938",
  "title": "2 in 1 Case for Oppo...",
  "productUrl": "https://www.lazada.co.id/products/pdp-i8777376072.html",
  "sourceUrl": "https://www.lazada.co.id/products/pdp-i8777376072.html",
  "image": "https://sg-test-11.slatic.net/p/16335a0fd8a0f1051641fd39af5a1014.jpg",
  "price": "Rp17.400",
  "currency": "Rp",
  "currencyCode": "IDR",
  "capturedAt": "2026-06-26T10:56:03.304392+00:00",
  "source": "lazada_browser_ajax",
  "sellerName": "PengKe",
  "ratingScore": 4.4,
  "reviewCount": 10,
  "soldText": "35 sold",
  "location": "Kab. Tangerang",
  "marketHost": "www.lazada.co.id",
  "searchUrl": "https://www.lazada.co.id/catalog/?q=phone+case",
  "ajaxUrl": "https://www.lazada.co.id/tag/phone-case/?q=phone+case&catalog_redirect_tag=true&ajax=true&page=1&isFirstRequest=true",
  "responseUrl": "https://www.lazada.co.id/tag/phone-case/?q=phone+case&catalog_redirect_tag=true&ajax=true&page=1&isFirstRequest=true",
  "responseStatus": 200,
  "pageType": "search"
}
```

### How it works

1. Validate input and resolve the target market.
2. Open the Lazada storefront in a Playwright browser context.
3. Apply lightweight warmup steps when the selected market needs it.
4. Open the search page for the keyword.
5. Fetch the structured AJAX payload from the in-page context.
6. Parse, normalize, deduplicate, and write dataset records.
7. Save `RUN_SUMMARY` and related KVS artifacts.

### Storage and debug artifacts

#### Key-value store

Typical keys include:

- `INPUT`
- `INPUT_ECHO`
- `RUN_SUMMARY`

#### Extra debug keys when `debug=true`

- `ERROR_SUMMARY`
- `DEBUG_KEYWORD_<slug>_PAGE_<n>_SCREENSHOT`
- `DEBUG_KEYWORD_<slug>_PAGE_<n>_HTML`
- `DEBUG_KEYWORD_<slug>_PAGE_<n>_PAYLOAD`
- `DEBUG_KEYWORD_<slug>_PAGE_<n>_META`

### Best practices

- Start with **one keyword**, **`pages=1`**, and **low `maxItems`**.
- Use **Apify residential proxies** for remote runs.
- Keep `debug=false` for routine runs and enable it only when investigating failures.
- Compare the same keyword across multiple markets to build cross-country price and ranking snapshots.

### Local development

#### Install

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
playwright install chromium
```

#### Run tests

```bash
PYTHONPATH=. .venv/bin/pytest -q
```

#### Run locally

```bash
PYTHONPATH=. .venv/bin/python -m src.main
```

### Known limitations

- This actor focuses on **search result listing collection**, not full product detail crawling.
- Long-term stability still depends on market conditions, proxy quality, and Lazada anti-bot behavior.
- Browser-based extraction is more expensive than pure HTTP scraping.

### Troubleshooting

#### Run succeeded but dataset is empty

Check:

- whether the keyword is too narrow
- whether `minItemsPerPage` is too high
- whether the site returned a challenge or unexpected payload

#### Market works locally but fails remotely

Check:

- proxy settings
- whether Apify Proxy is enabled
- whether the selected market matches the proxy country
- `RUN_SUMMARY` and debug artifacts in KVS

#### TH / ID are less stable than other markets

These markets can be stricter. The actor already includes market-specific warmup and punish recovery, but stability can still vary with traffic conditions and IP quality.

### Reference style used for this README

This README was rewritten in the style of a stronger Apify Store listing: clearer overview, use-case framing, input/output examples, and a visual top section inspired by the presentation style seen on `fatihtahta/lazada-scraper`, while keeping the feature claims aligned with the actual code in this repository.

# Actor input Schema

## `keywords` (type: `array`):

Search keywords to query on Lazada. Empty or whitespace-only entries are removed before validation.

## `market` (type: `string`):

Target Lazada country site. The actor uses the matching site host and, on Apify, automatically selects the matching residential proxy country for that market.

## `pages` (type: `integer`):

How many Lazada search result pages to fetch per keyword. Hard-capped at 3 for v1.

## `maxItems` (type: `integer`):

Maximum number of normalized rows written to the dataset after dedupe.

## `minItemsPerPage` (type: `integer`):

Minimum acceptable number of listItems in a parsed AJAX payload. Lower this only for low-result keywords.

## `headless` (type: `boolean`):

Whether the browser should run in headless mode. Disable only for local debugging.

## `includeRawPayload` (type: `boolean`):

When enabled, raw AJAX payloads are stored in the key-value store. This improves debugging but increases storage cost.

## `debug` (type: `boolean`):

When enabled, failures attempt to store screenshots, page HTML, payload metadata, and extra logs in the key-value store.

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

Apify Proxy or custom proxy configuration for remote anti-bot evasion. When Apify Proxy is used, the actor automatically pins the residential proxy country to the selected market (for example PH -> Philippines proxy, SG -> Singapore proxy) and enforces market/proxy country consistency.

## `maxRetriesPerKeyword` (type: `integer`):

How many times to retry a keyword after a recoverable failure before marking it failed.

## `requestTimeoutSecs` (type: `integer`):

Per-keyword timeout budget for page navigation, AJAX fetch, and parsing work.

## `scrollSteps` (type: `integer`):

How many light scroll steps to perform after landing on the search page before calling the AJAX endpoint.

## `scrollDelayMs` (type: `integer`):

Delay in milliseconds between light scroll steps to give the page time to hydrate.

## `postLoadWaitMs` (type: `integer`):

Extra wait after initial page load before collecting AJAX data, useful when Lazada renders late.

## Actor input object example

```json
{
  "keywords": [
    "phone case"
  ],
  "market": "PH",
  "pages": 1,
  "maxItems": 40,
  "minItemsPerPage": 1,
  "headless": true,
  "includeRawPayload": false,
  "debug": false,
  "maxRetriesPerKeyword": 1,
  "requestTimeoutSecs": 90,
  "scrollSteps": 3,
  "scrollDelayMs": 300,
  "postLoadWaitMs": 1200
}
```

# Actor output Schema

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

Normalized Lazada search result items from the default dataset.

## `runSummary` (type: `string`):

Structured summary record stored in the default key-value store.

## `inputEcho` (type: `string`):

Normalized input saved at run start.

## `errorSummary` (type: `string`):

Present when the run finishes with an error and an error summary is saved.

# 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 = {
    "keywords": [
        "phone case"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/lazada-ph-search-results-collector").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 = { "keywords": ["phone case"] }

# Run the Actor and wait for it to finish
run = client.actor("lentic_clockss/lazada-ph-search-results-collector").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 '{
  "keywords": [
    "phone case"
  ]
}' |
apify call lentic_clockss/lazada-ph-search-results-collector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lentic_clockss/lazada-ph-search-results-collector",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Lazada Produc Scraper -SG, MY, PH, TH, VN, ID",
        "description": "Lazada Scraper With Reviews extracts structured product listing and customer review data from Lazada across MY, SG, ID, PH, TH, and VN. It captures titles, URLs, pricing, ratings, seller details, media assets, inventory signals, and review content in a consistent format for analytics, monitoring",
        "version": "0.1",
        "x-build-id": "nWA6Iy5xmr2GiBmXZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~lazada-ph-search-results-collector/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-lazada-ph-search-results-collector",
                "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/lentic_clockss~lazada-ph-search-results-collector/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-lazada-ph-search-results-collector",
                "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/lentic_clockss~lazada-ph-search-results-collector/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-lazada-ph-search-results-collector",
                "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": [
                    "keywords"
                ],
                "properties": {
                    "keywords": {
                        "title": "Keywords",
                        "minItems": 1,
                        "maxItems": 20,
                        "type": "array",
                        "description": "Search keywords to query on Lazada. Empty or whitespace-only entries are removed before validation.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "market": {
                        "title": "Market",
                        "enum": [
                            "PH",
                            "SG",
                            "MY",
                            "TH",
                            "VN",
                            "ID"
                        ],
                        "type": "string",
                        "description": "Target Lazada country site. The actor uses the matching site host and, on Apify, automatically selects the matching residential proxy country for that market.",
                        "default": "PH"
                    },
                    "pages": {
                        "title": "Pages per keyword",
                        "minimum": 1,
                        "maximum": 3,
                        "type": "integer",
                        "description": "How many Lazada search result pages to fetch per keyword. Hard-capped at 3 for v1.",
                        "default": 1
                    },
                    "maxItems": {
                        "title": "Maximum output items",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of normalized rows written to the dataset after dedupe.",
                        "default": 40
                    },
                    "minItemsPerPage": {
                        "title": "Minimum items per page",
                        "minimum": 1,
                        "maximum": 40,
                        "type": "integer",
                        "description": "Minimum acceptable number of listItems in a parsed AJAX payload. Lower this only for low-result keywords.",
                        "default": 1
                    },
                    "headless": {
                        "title": "Run browser headless",
                        "type": "boolean",
                        "description": "Whether the browser should run in headless mode. Disable only for local debugging.",
                        "default": true
                    },
                    "includeRawPayload": {
                        "title": "Save raw AJAX payloads",
                        "type": "boolean",
                        "description": "When enabled, raw AJAX payloads are stored in the key-value store. This improves debugging but increases storage cost.",
                        "default": false
                    },
                    "debug": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "When enabled, failures attempt to store screenshots, page HTML, payload metadata, and extra logs in the key-value store.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy or custom proxy configuration for remote anti-bot evasion. When Apify Proxy is used, the actor automatically pins the residential proxy country to the selected market (for example PH -> Philippines proxy, SG -> Singapore proxy) and enforces market/proxy country consistency."
                    },
                    "maxRetriesPerKeyword": {
                        "title": "Max retries per keyword",
                        "minimum": 0,
                        "maximum": 3,
                        "type": "integer",
                        "description": "How many times to retry a keyword after a recoverable failure before marking it failed.",
                        "default": 1
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 15,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-keyword timeout budget for page navigation, AJAX fetch, and parsing work.",
                        "default": 90
                    },
                    "scrollSteps": {
                        "title": "Scroll steps",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "How many light scroll steps to perform after landing on the search page before calling the AJAX endpoint.",
                        "default": 3
                    },
                    "scrollDelayMs": {
                        "title": "Delay after each scroll (ms)",
                        "minimum": 0,
                        "maximum": 3000,
                        "type": "integer",
                        "description": "Delay in milliseconds between light scroll steps to give the page time to hydrate.",
                        "default": 300
                    },
                    "postLoadWaitMs": {
                        "title": "Wait after page load (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Extra wait after initial page load before collecting AJAX data, useful when Lazada renders late.",
                        "default": 1200
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
