# Albert Heijn Product Scraper (`incognito_mode/albert-heijn-product-scraper`) Actor

Scrape every Albert Heijn (ah.nl) product: name, brand, price, bonus/discount, unit price, pack size, category and image. Clean JSON/CSV. National pricing, no login needed. Filter by category or search keyword. Failed lookups are never billed.

- **URL**: https://apify.com/incognito\_mode/albert-heijn-product-scraper.md
- **Developed by:** [Elena Vance](https://apify.com/incognito_mode) (community)
- **Categories:** E-commerce, Developer tools, Integrations
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 product results

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

## Albert Heijn Product Scraper — Prices, Bonus Discounts, Unit Prices & Images from AH.nl

**Turn the entire Albert Heijn Netherlands (ah.nl) assortment into clean, structured
JSON or CSV: product name, brand, current price, Bonus offer/discount, per-unit price
(€/kg, €/l), pack size, category, image, and the product link — one tidy record per
product.**

Browse the whole catalog by category, or search by keyword, and get back data ready to
drop into a spreadsheet, database, price-comparison site, or app. No login and no account
needed — and **you are never billed for failed requests**.

> **Good to know:** this Actor runs through a **Dutch residential proxy** (already
> pre-selected in the input — just keep it enabled). AH uses a single **national** price
> list, so one run captures the price every shopper in the Netherlands sees.

---

### Why this Actor

- **National pricing in one run.** Albert Heijn publishes one price list for the whole
  country — no per-store fan-out, no store IDs. One run = the price everyone sees.
- **Bonus offers and discounts, detected for you.** Each record carries the current
  `price`, the pre-discount `priceBeforeBonus`, an `isBonus` flag, and a `discountLabel`
  (AH's own Bonus wording, e.g. `2 voor 3` or `25% korting`) — filter the whole
  assortment down to this week's deals in one expression.
- **Per-unit prices for real comparison.** `pricePerUnit` + `pricePerUnitType` (per
  **kg**, **l**, piece, …) are parsed from AH's own unit-price text, so you can compare
  value across pack sizes — and against other supermarkets.
- **The full assortment, or a focused slice.** Leave everything default to scrape every
  one of AH's 27 root categories, list specific category taxonomy IDs, or pass a search
  keyword.
- **Complete product detail.** Brand, description, pack size, main/sub category, the
  product image, and the canonical ah.nl product URL — one normalized record.
- **You never pay for failures.** Failed requests, timeouts, and removed products are
  reported in the run summary — **not** written to your dataset and **not billed**.
- **Fast and lightweight.** Runs are quick and compute stays minimal, so large jobs
  finish without burning credits.
- **Clean, consistent EUR output.** Prices as euro floats, whitespace-normalized text,
  JSON-safe values throughout.

---

### Problems this Actor solves

| If you are… | Your problem | How this Actor solves it |
|---|---|---|
| **A price-comparison / deals site** | Keeping a grocery price database current by hand is impossible | Schedule a daily run; ingest every product with price, Bonus offer, and unit price as JSON |
| **A market researcher / analyst** | Grocery-price and inflation tracking needs structured, repeatable data | Dated, normalized records per product — export straight to pandas, Sheets, or BI |
| **A category manager at another retailer** | Benchmarking a competitor's assortment and pricing is slow and partial | Full category-level coverage with price **and** unit price in a single run |
| **An app / chatbot / agent developer** | You need AH catalog data without building and babysitting a scraper | Pay per record on demand; a stable, normalized schema you can rely on |
| **A deal hunter / content creator** | Finding the best weekly Bonus deals means clicking through the site | Pull the assortment and filter on `isBonus` / `discountLabel`, or run with **Only bonus products** on |

---

### What data you get

Each available product becomes one dataset record:

| Field | Description |
|---|---|
| `id` | Stable record id, `wi` + AH's `webshopId` (the dedup key) |
| `webshopId` | Albert Heijn's numeric webshop product id |
| `title` | Product name |
| `brand` | Brand name (incl. AH house brands like *AH*, *AH Biologisch*), when present |
| `description` | Full or highlight product description, when available |
| `categoryId` / `categoryName` | The root category's taxonomy id and Dutch name (category mode) |
| `mainCategory` / `subCategory` | AH's own category labels from the product, when present |
| `price` | Current price as a EUR float (Bonus price when on offer, else the shelf price) |
| `currency` | Always `EUR` |
| `priceBeforeBonus` | The pre-discount price when the product is on Bonus and it is higher than now (else `null`) |
| `isBonus` | `true` when the product is currently in the AH Bonus (on promotion) |
| `discountLabel` | AH's Bonus wording (e.g. `2 voor 3`), or a computed `N% korting` (else `null`) |
| `unitSize` | Pack / sales unit text (e.g. `500 g`, `1 l`, `per stuk`) |
| `pricePerUnit` / `pricePerUnitType` | Per-unit price and its unit (`kg`, `l`, `stuk`, …) |
| `imageUrl` | Product image (widest available rendition) |
| `productUrl` | Canonical ah.nl product page |
| `source` | Constant source tag carried on every record |
| `scrapedAt` | ISO 8601 timestamp of the run |
| `rawData` | *Optional:* the full raw AH product object, when **Include raw product data** is on |

#### Example output

```jsonc
{
  "id": "wi83937",
  "webshopId": 83937,
  "title": "AH Biologisch Halfvolle melk",
  "brand": "AH Biologisch",
  "description": "Biologische halfvolle melk, 1 liter.",
  "categoryId": "1730",
  "categoryName": "Zuivel, eieren",
  "mainCategory": "Zuivel, plantaardig en eieren",
  "subCategory": "Melk",
  "price": 1.29,
  "currency": "EUR",
  "priceBeforeBonus": 1.59,   // present because this product is on Bonus
  "isBonus": true,
  "discountLabel": "25% korting",
  "unitSize": "1 l",
  "pricePerUnit": 1.29,       // i.e. € 1.29 / l
  "pricePerUnitType": "l",
  "imageUrl": "https://static.ah.nl/dam/product/.../1600x1600.jpg",
  "productUrl": "https://www.ah.nl/producten/product/wi83937",
  "scrapedAt": "2026-06-18T08:30:00+00:00"
}
````

Requests that could not be fetched are **not** written to the dataset (and never billed).
They are listed in the run's `SUMMARY` record in the key-value store —
`{ "failures": [ { "input": "…", "error": "…" } ] }` — and the run's status message tells
you at a glance how many products succeeded.

***

### How to use it (60 seconds)

1. Click **Try for free / Start**.
2. Choose what to scrape:
   - **Everything (default):** leave the inputs empty to scrape the full AH assortment
     (all 27 root categories).
   - **Specific categories:** add one AH category **taxonomy ID** per line under
     **Category taxonomy IDs**, e.g. `1730` (Zuivel, eieren) or `9344` (Vlees).
   - **A keyword:** type a term like `melk` under **Search keyword** (when set, the
     category list is ignored).
3. (Optional) Turn on **Only bonus / discounted products** to get just this week's deals.
4. Keep the **Dutch residential proxy** enabled (recommended — see above).
5. Click **Save & Start**. Download results as **JSON, CSV, Excel, or via API** from the
   **Dataset** tab; check **Key-value store → SUMMARY** for run totals and any failed
   requests.

***

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| **Category taxonomy IDs** | list | *(empty)* | One AH taxonomy ID per line (e.g. `1730`, `9344`). Empty = scrape all 27 root categories (full assortment). |
| **Search keyword** | string | – | Scrape products matching a term (e.g. `melk`) instead of browsing categories. When set, the category list is ignored. |
| **Only bonus / discounted products** | boolean | `false` | When on, only products currently in the AH Bonus (on promotion) are returned. |
| **Include raw product data** | boolean | `false` | Adds the full raw AH product object under `rawData`. Increases item size. |
| **Proxy configuration** | object | Apify Residential, **NL** | Recommended — keep the Dutch residential default enabled. |
| **Max concurrency** | integer | `5` | Parallel requests (1–20). Kept moderate to be respectful. |
| **Delay between requests** | integer | `0` | Politeness delay in seconds before each request (0–10). |
| **Max items** | integer | `0` | Stop after N product records (`0` = unlimited). |

***

### What to expect

In **category mode** the Actor covers each selected root category in full; in **search
mode** it returns the products matching your keyword. Either way, products are
**de-duplicated by their webshop id**, prices are returned as euro floats (the Bonus price
when a product is on promotion, otherwise the shelf price), and per-unit prices are
normalized so you can compare value across pack sizes.

A product with no usable price (out of stock / not orderable) is skipped — every record
you receive has a real price.

***

### Pricing — what a run costs

This Actor uses transparent **pay-per-event** pricing with a built-in **volume discount**:
a small Actor-start fee, a fixed price per successful product record for the first 10,000
results of a run, and a cheaper rate for every result beyond that. **No subscription, no
minimums, and failures are never charged.** The exact per-result rate is shown on the
Actor's **Pricing** tab.

- **Failed requests are free.** Failed requests, timeouts, and removed products are
  reported in the summary, never billed.
- **Bigger runs cost less per item.** The discount tier resets per run, so one large run
  is cheaper than the same job split into many small ones.
- **Try it free:** an Apify free account includes **$5 of monthly platform credit** —
  enough to try the Actor before paying anything.
- **Stay in control:** set **Max items** and Apify's **maximum charge per run**; the Actor
  stops gracefully at your cap, keeping everything already scraped.

***

### Compared to the alternatives

| | **This Actor** | Build your own scraper | Manual checking |
|---|---|---|---|
| Full assortment, normalized | Yes | You maintain it | Impractical |
| Bonus offers & discount labels | Yes | You maintain it | One product at a time |
| Per-unit prices (€/kg, €/l) | Yes | You compute it | Mental math |
| Dutch residential proxy built in | Yes | You source proxies | – |
| Reliable access handled for you | Yes | You maintain it | – |
| Never billed for failures | Yes | – | – |
| Export JSON / CSV / Excel / API | Yes, built-in | DIY | Copy-paste |
| Setup time | ~60 seconds | Days; breaks when the site changes | Hours per run |

***

### Integrate the data

- **Exports:** JSON, CSV, Excel, XML from the Dataset tab — or fetch programmatically:
  ```
  GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
  ```
- **Run on a schedule:** use Apify **Schedules** to refresh prices daily or weekly, and
  **webhooks** to push finished runs into your pipeline (Sheets, Slack, your backend).
- **From code:** call the Actor with the [Apify API or SDKs](https://docs.apify.com/api)
  (Python / JavaScript) and read the dataset when the run finishes.
- **Run summary:** every run writes a `SUMMARY` record (key-value store) with totals,
  successes, failures, and billing counts — ideal for monitoring automated pipelines.

***

### FAQ

**Do I need an Albert Heijn account or login?**
No. There is no login or account to set up — just start the Actor.

**Why is a Dutch proxy recommended?**
The Actor ships with a Dutch residential proxy pre-selected for reliable access — keep it
on. If you disable it, runs may return no products (any issue is reported in `SUMMARY`).

**Are prices per store?**
No — Albert Heijn uses a single national price list, so one run reflects the price
nationwide.

**What does "Bonus" mean?**
"Bonus" is Albert Heijn's term for a promotion / discount. When a product is on Bonus,
`isBonus` is `true`, `price` is the promo price, `priceBeforeBonus` holds the pre-discount
price, and `discountLabel` carries AH's wording (e.g. `2 voor 3`).

**How do I get only discounted products?**
Turn on **Only bonus / discounted products**, or scrape everything and filter on
`isBonus == true` (or a non-null `discountLabel`).

**What are the category taxonomy IDs?**
They are AH's numeric category identifiers (e.g. `1730` = Zuivel/eieren, `9344` = Vlees).
Leave the field empty to scrape all 27 root categories automatically.

**How fresh is the data?**
Each run fetches live data, so you get exactly what ah.nl shows at that moment. Schedule
the Actor to keep your dataset as fresh as you need.

**What formats can I export?**
JSON, CSV, Excel, XML — from the Console or via the Apify API.

***

### Related Actors

Part of a family of Dutch supermarket scrapers — **the same clean schema and pay-per-event
billing across every chain, so you can mix and match for full-market coverage:**

- **Lidl Product Scraper** — includes Lidl Plus member prices.
- **Plus Product Scraper** — per-store pricing.
- **Dirk van den Broek Product Scraper** — store-specific pricing.
- **DekaMarkt Product Scraper** — store-specific pricing.
- **Hoogvliet Product Scraper** — pairs with the **Hoogvliet Category Scraper** (run category
  first to map the tree, then product).

Add the others alongside this Albert Heijn run to benchmark prices and Bonus offers across every
major Dutch grocer in one consistent dataset.

***

### Disclaimer

This Actor is intended for personal and research use. You are responsible for ensuring your
use complies with Albert Heijn's terms and applicable law. Please scrape responsibly — keep
concurrency moderate and delays reasonable. This project is not affiliated with, endorsed
by, or sponsored by Albert Heijn.

# Actor input Schema

## `categoryIds` (type: `array`):

One AH taxonomy ID per line to scrape only those root categories (e.g. 1730 for Zuivel/eieren, 9344 for Vlees). Leave empty to scrape all 27 root categories (the full assortment).

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

Scrape products matching a search term (e.g. "melk") instead of browsing categories. When set, the category list above is ignored.

## `bonusOnly` (type: `boolean`):

When enabled, only products currently in the AH Bonus (on promotion) are returned.

## `includeRawData` (type: `boolean`):

Adds the full raw AH product object to each record under 'rawData'. Increases item size; leave off unless you need fields beyond the normalized ones.

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

A Dutch residential proxy is recommended. The default selects Apify Residential proxy in NL. Keep this preselected option enabled.

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

Maximum number of parallel requests. Keep this moderate to stay respectful.

## `requestDelaySecs` (type: `integer`):

Politeness delay applied before each request. 0 is fine at moderate concurrency.

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

Stop after producing this many product records. Set to 0 for no limit (full assortment).

## Actor input object example

```json
{
  "categoryIds": [
    "1730",
    "9344"
  ],
  "bonusOnly": false,
  "includeRawData": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  },
  "maxConcurrency": 5,
  "requestDelaySecs": 0,
  "maxItems": 0
}
```

# Actor output Schema

## `products` (type: `string`):

All scraped product records (one item per product).

## `summary` (type: `string`):

JSON summary of the run: totals, successes, failures, and billing counts.

# 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 = {
    "categoryIds": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("incognito_mode/albert-heijn-product-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 = {
    "categoryIds": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "NL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("incognito_mode/albert-heijn-product-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 '{
  "categoryIds": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  }
}' |
apify call incognito_mode/albert-heijn-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=incognito_mode/albert-heijn-product-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Albert Heijn Product Scraper",
        "description": "Scrape every Albert Heijn (ah.nl) product: name, brand, price, bonus/discount, unit price, pack size, category and image. Clean JSON/CSV. National pricing, no login needed. Filter by category or search keyword. Failed lookups are never billed.",
        "version": "0.1",
        "x-build-id": "1oZejC4hLMFL47rZ6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/incognito_mode~albert-heijn-product-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-incognito_mode-albert-heijn-product-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/incognito_mode~albert-heijn-product-scraper/runs": {
            "post": {
                "operationId": "runs-sync-incognito_mode-albert-heijn-product-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/incognito_mode~albert-heijn-product-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-incognito_mode-albert-heijn-product-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": {
                    "categoryIds": {
                        "title": "Category taxonomy IDs (optional)",
                        "type": "array",
                        "description": "One AH taxonomy ID per line to scrape only those root categories (e.g. 1730 for Zuivel/eieren, 9344 for Vlees). Leave empty to scrape all 27 root categories (the full assortment).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQuery": {
                        "title": "Search keyword (optional)",
                        "type": "string",
                        "description": "Scrape products matching a search term (e.g. \"melk\") instead of browsing categories. When set, the category list above is ignored."
                    },
                    "bonusOnly": {
                        "title": "Only bonus / discounted products",
                        "type": "boolean",
                        "description": "When enabled, only products currently in the AH Bonus (on promotion) are returned.",
                        "default": false
                    },
                    "includeRawData": {
                        "title": "Include raw product data",
                        "type": "boolean",
                        "description": "Adds the full raw AH product object to each record under 'rawData'. Increases item size; leave off unless you need fields beyond the normalized ones.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "A Dutch residential proxy is recommended. The default selects Apify Residential proxy in NL. Keep this preselected option enabled.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "NL"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of parallel requests. Keep this moderate to stay respectful.",
                        "default": 5
                    },
                    "requestDelaySecs": {
                        "title": "Delay between requests (seconds)",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Politeness delay applied before each request. 0 is fine at moderate concurrency.",
                        "default": 0
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after producing this many product records. Set to 0 for no limit (full assortment).",
                        "default": 0
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
