# EU Beauty Price Corridor — Notino Prices in 24 Countries (`studio-amba/eu-beauty-price-corridor`) Actor

Compare beauty and OTC product prices across 24 Notino country storefronts in one run. Matches products by EAN barcode and Notino product ID with a fuzzy-name fallback, normalizes every price to EUR via ECB rates, and flags the cheapest market and spread.

- **URL**: https://apify.com/studio-amba/eu-beauty-price-corridor.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 corridor rows

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## EU Beauty Price Corridor

Compare beauty and OTC product prices across all 24 Notino country storefronts in a single run. Give it a product name or brand, and it returns one row per product per country: the price in local currency, the same price converted to EUR, and whether that country's Notino site carries the product at all.

This actor does not scrape a website itself. It runs our 24 Notino country scrapers in parallel (fr, de, it, es, pl, cz, co-uk, nl, at, be, bg, dk, ee, fi, gr, hr, hu, ie, lt, lv, ro, se, si, sk), matches what comes back by EAN barcode and by Notino's own product ID, converts every price to EUR, and builds the cross-border comparison from the results.

### Why use this actor?

Notino runs one platform across ~24 European storefronts with the same catalogue at different local prices. Parallel-import traders and beauty/OTC pricing managers need to know where a SKU is cheapest and how wide the spread is, right now. Checking that by hand across 24 sites, in 15 different currencies, is slow. This actor fans out to every storefront, matches the SKU, normalizes the currency, and returns a flat table you can sort straight to the widest price gaps.

### What makes the match reliable

Notino is a single platform, not 24 independent retailers. That means the same product carries the **same Notino product ID** on every country site — a much stronger match key than the fuzzy name matching most cross-retailer comparisons have to fall back on. This actor uses three tiers, in priority order:

1. **EAN/GTIN barcode** — the primary key, when Notino exposes it for that product.
2. **Notino product ID** — the secondary key. Since it's one platform, the same product on notino.fr and notino.de shares the same ID even when the barcode field is empty on one side.
3. **Fuzzy product name** — a last-resort fallback (60% token overlap) for products where neither of the above is available.

Every row's `matchType` field tells you which tier produced that group, so you can judge match confidence directly in the data.

### What it returns

Each row in the output is one product at one country's Notino site. If a country doesn't carry that product (or its scraper failed for this run), you still get a row for it, marked `available: false`, so "we checked and it's not there" is distinguishable from "we didn't check."

```json
[
    {
        "query": "la roche posay effaclar duo",
        "productName": "La Roche-Posay Effaclar Duo+ Corrective Anti-Blemish Care",
        "brand": "La Roche-Posay",
        "ean": "3337875597969",
        "notinoProductId": "156234",
        "country": "fr",
        "currencyLocal": "EUR",
        "priceLocal": 16.90,
        "priceEur": 16.90,
        "promoPriceLocal": null,
        "promoPriceEur": null,
        "available": true,
        "url": "https://www.notino.fr/la-roche-posay/effaclar-duo-soin-correcteur-anti-imperfections/",
        "imageUrl": "https://cdn.notino.com/...",
        "matchType": "ean",
        "cheapestCountry": "pl",
        "priceSpreadPct": 34.2,
        "absenceReason": null
    },
    {
        "query": "la roche posay effaclar duo",
        "productName": "La Roche-Posay Effaclar Duo+ Corrective Anti-Blemish Care",
        "brand": "La Roche-Posay",
        "ean": "3337875597969",
        "notinoProductId": "156234",
        "country": "co-uk",
        "currencyLocal": "GBP",
        "priceLocal": 14.20,
        "priceEur": 16.90,
        "promoPriceLocal": null,
        "promoPriceEur": null,
        "available": true,
        "url": "https://www.notino.co.uk/la-roche-posay/effaclar-duo-corrective-unclogging-care/",
        "imageUrl": "https://cdn.notino.com/...",
        "matchType": "ean",
        "cheapestCountry": "pl",
        "priceSpreadPct": 34.2,
        "absenceReason": null
    }
]
````

### Use cases

- **Parallel-import traders** looking for beauty/OTC SKUs that are meaningfully cheaper in one EU market than another.
- **Beauty and OTC pricing managers** monitoring how a brand's Notino price varies across the 24 markets it sells in.
- **Category managers** building an EUR-normalized reference price for a shopping list of SKUs.
- **EAN/GTIN matching** for teams with a barcode list who want a live cross-border price check on any of those products.

### How to scrape Notino data

1. Enter a product name or brand in **Search Query**, e.g. `dior sauvage` or `chanel no 5`. Fragrance queries resolve fastest; skincare and OTC queries (e.g. `la roche posay effaclar`) also work but take longer.
2. Choose which **Countries** to include. The core 8 markets (France, Germany, Italy, Spain, Poland, Czechia, UK, Netherlands) are selected by default; add more from the remaining 16 for wider coverage.
3. Set **Max Items Per Source** to control how many candidate products each country's site contributes.
4. Run the actor. All selected countries are queried in parallel, so adding countries doesn't multiply the run time.
5. Open the dataset. Each matched product has one row per country: a price row where it's carried, an absence row where it isn't.
6. Use `cheapestCountry` and `priceSpreadPct` to sort straight to the products with the widest cross-border price gaps.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | string | Product name or brand to price-check on Notino. Defaults to `"dior sauvage"`. |
| `countries` | array | Which of the 24 Notino country sites to include (`fr`, `de`, `it`, `es`, `pl`, `cz`, `co-uk`, `nl`, `at`, `be`, `bg`, `dk`, `ee`, `fi`, `gr`, `hr`, `hu`, `ie`, `lt`, `lv`, `ro`, `se`, `si`, `sk`). Defaults to the core 8. |
| `maxItemsPerSource` | integer | Max candidate products considered per country per query (1-50, default 10). |
| `timeoutPerSourceSecs` | integer | Max seconds to wait for each country's scraper before treating it as failed (30-600, default 120). |
| `proxyConfiguration` | object | Proxy settings passed to the underlying Notino scrapers. Each already runs its own Bright Data Web Unlocker for the Cloudflare wall; this is only used for their best-effort direct fallback. |

#### Example input

```json
{
    "searchQuery": "dior sauvage",
    "countries": ["fr", "de", "it", "es", "pl", "cz", "co-uk", "nl"],
    "maxItemsPerSource": 10,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output

| Field | Type | Description |
|-------|------|-------------|
| `query` | string | The search query this row was matched against |
| `productName` | string | Canonical product name |
| `brand` | string | Product brand, when exposed |
| `ean` | string | Normalized EAN barcode used for matching, or null |
| `notinoProductId` | string | Notino's own product ID, used as the secondary match key |
| `country` | string | ISO country code of the Notino storefront this row refers to |
| `currencyLocal` | string | Currency code as returned by that country's site (EUR, GBP, PLN, CZK, ...) |
| `priceLocal` | number | Regular price in local currency, null on an absence row |
| `priceEur` | number | Regular price converted to EUR via the ECB daily reference rate |
| `promoPriceLocal` / `promoPriceEur` | number | Reserved for a discounted price; Notino's product data doesn't expose a separate promo price today, so these are currently always null |
| `available` | boolean | False on an absence row |
| `url` | string | Product page URL on that country's Notino site |
| `imageUrl` | string | Product image URL |
| `matchType` | string | `ean` (barcode), `productId` (Notino's own ID), or `name` (fuzzy match) |
| `cheapestCountry` | string | Country with the lowest EUR price for this matched product |
| `priceSpreadPct` | number | Percentage gap between the highest and lowest EUR price found |
| `absenceReason` | string | `not_found` (site checked, doesn't carry it) or `source_failed` (that country's scraper timed out or errored) |

### Currency normalization

Every price is converted to EUR using the European Central Bank's daily reference rates (`eurofxref-daily.xml`), fetched once at the start of each run — no API key required. If the ECB feed is unreachable for any reason, the actor falls back to an embedded table of approximate rates and logs a warning; a run never zeroes out because of an FX fetch failure.

### Matching logic

Products are matched across countries in three tiers: EAN/GTIN barcode first (leading zeros stripped), then Notino's own product ID (a strong key since Notino is one platform serving all 24 storefronts), then fuzzy product-name matching (60% token overlap) as a last resort. `matchType` on every row tells you which tier produced that group.

### FAQ

**Does this actor scrape Notino itself?**
No. It calls our own 24 Notino country scrapers and combines their output. Each of those actors is also available separately on the Store.

**Why is `notinoProductId` sometimes more reliable than `ean`?**
Not every Notino product page exposes a GTIN in its structured data, but the product ID is always present. Since it's the same platform on every storefront, matching on it is close to as reliable as a barcode match.

**Do I need my own Bright Data key?**
No. Each underlying Notino scraper authenticates with its own Bright Data Web Unlocker key on its Apify deployment. This actor forwards its own `BRIGHT_DATA_API_KEY` environment variable defensively as a fallback, but normally never needs to.

**How is `priceSpreadPct` calculated?**
`(highest EUR price - lowest EUR price) / lowest EUR price * 100`, across whichever countries actually carry the matched product. It's null when only one country has the product.

**How many countries can I check in one run?**
All 24, if you want. Each selected country runs its own scraper call in parallel, so adding countries doesn't multiply run time the way adding more search queries would.

### Limitations

- Matching quality depends on EAN and product-ID coverage. Products with neither rely on fuzzy name matching, which can occasionally group similar-but-different pack sizes together.
- Prices reflect each Notino storefront's standard online price at the time of the run.
- EUR conversion uses the ECB's daily reference rate, which updates once per business day — intraday FX moves aren't reflected.
- Notino's product data doesn't expose a separate promotional price, so `promoPriceLocal`/`promoPriceEur` are placeholders in this version.
- Data is scraped from public Notino pages and may change without notice.

### Related actors

This corridor is built on our standalone Notino country scrapers, each of which you can also run on its own for a full-catalogue pull:

- [Notino France Scraper](https://apify.com/studio-amba/notino-fr-scraper)
- [Notino Germany Scraper](https://apify.com/studio-amba/notino-de-scraper)
- [Notino Italy Scraper](https://apify.com/studio-amba/notino-it-scraper)
- [Notino Spain Scraper](https://apify.com/studio-amba/notino-es-scraper)
- [Notino Poland Scraper](https://apify.com/studio-amba/notino-pl-scraper)

We run this comparison as a managed service too: scheduled runs, a fixed SKU list, and delivery to your inbox, Google Sheets, or API, maintenance included. See [studioamba.dev/services](https://studioamba.dev/services/) or email <hello@studioamba.dev> for a free data sample.

# Actor input Schema

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

Product name or brand to price-check on Notino (e.g. 'dior sauvage', 'chanel no 5', 'la roche posay effaclar'). Matched against Notino product URLs, which carry the brand and product name. Perfume/fragrance queries resolve fastest; skincare and OTC queries also work but take longer.

## `countries` (type: `array`):

Which Notino country storefronts to include in the comparison. The core 8 markets are selected by default; add more for wider coverage (each extra country adds one parallel child-actor run, not run time).

## `maxItemsPerSource` (type: `integer`):

Maximum number of candidate products to consider from each country's Notino site per query. Higher values catch more variants but take longer and cost more.

## `timeoutPerSourceSecs` (type: `integer`):

Maximum time to wait for each underlying Notino country scraper to finish. A slow or failing country is skipped after this and reported as an absence row rather than blocking the whole run.

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

Proxy settings passed to the underlying Notino country scrapers. Each of those actors already runs its own Bright Data Web Unlocker for the Cloudflare wall; this proxy is only used for their best-effort direct fallback.

## Actor input object example

```json
{
  "searchQuery": "dior sauvage",
  "countries": [
    "fr",
    "de",
    "it",
    "es",
    "pl",
    "cz",
    "co-uk",
    "nl"
  ],
  "maxItemsPerSource": 10,
  "timeoutPerSourceSecs": 120,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "dior sauvage",
    "countries": [
        "fr",
        "de",
        "it",
        "es",
        "pl",
        "cz",
        "co-uk",
        "nl"
    ],
    "maxItemsPerSource": 10,
    "timeoutPerSourceSecs": 120,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/eu-beauty-price-corridor").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 = {
    "searchQuery": "dior sauvage",
    "countries": [
        "fr",
        "de",
        "it",
        "es",
        "pl",
        "cz",
        "co-uk",
        "nl",
    ],
    "maxItemsPerSource": 10,
    "timeoutPerSourceSecs": 120,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/eu-beauty-price-corridor").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 '{
  "searchQuery": "dior sauvage",
  "countries": [
    "fr",
    "de",
    "it",
    "es",
    "pl",
    "cz",
    "co-uk",
    "nl"
  ],
  "maxItemsPerSource": 10,
  "timeoutPerSourceSecs": 120,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/eu-beauty-price-corridor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/eu-beauty-price-corridor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EU Beauty Price Corridor — Notino Prices in 24 Countries",
        "description": "Compare beauty and OTC product prices across 24 Notino country storefronts in one run. Matches products by EAN barcode and Notino product ID with a fuzzy-name fallback, normalizes every price to EUR via ECB rates, and flags the cheapest market and spread.",
        "version": "0.1",
        "x-build-id": "eGYFbdheCiFQPCghS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~eu-beauty-price-corridor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-eu-beauty-price-corridor",
                "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/studio-amba~eu-beauty-price-corridor/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-eu-beauty-price-corridor",
                "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/studio-amba~eu-beauty-price-corridor/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-eu-beauty-price-corridor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Product name or brand to price-check on Notino (e.g. 'dior sauvage', 'chanel no 5', 'la roche posay effaclar'). Matched against Notino product URLs, which carry the brand and product name. Perfume/fragrance queries resolve fastest; skincare and OTC queries also work but take longer."
                    },
                    "countries": {
                        "title": "Countries",
                        "type": "array",
                        "description": "Which Notino country storefronts to include in the comparison. The core 8 markets are selected by default; add more for wider coverage (each extra country adds one parallel child-actor run, not run time).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "fr",
                                "de",
                                "it",
                                "es",
                                "pl",
                                "cz",
                                "co-uk",
                                "nl",
                                "at",
                                "be",
                                "bg",
                                "dk",
                                "ee",
                                "fi",
                                "gr",
                                "hr",
                                "hu",
                                "ie",
                                "lt",
                                "lv",
                                "ro",
                                "se",
                                "si",
                                "sk"
                            ],
                            "enumTitles": [
                                "France",
                                "Germany",
                                "Italy",
                                "Spain",
                                "Poland",
                                "Czechia",
                                "United Kingdom",
                                "Netherlands",
                                "Austria",
                                "Belgium",
                                "Bulgaria",
                                "Denmark",
                                "Estonia",
                                "Finland",
                                "Greece",
                                "Croatia",
                                "Hungary",
                                "Ireland",
                                "Lithuania",
                                "Latvia",
                                "Romania",
                                "Sweden",
                                "Slovenia",
                                "Slovakia"
                            ]
                        }
                    },
                    "maxItemsPerSource": {
                        "title": "Max Items Per Source",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of candidate products to consider from each country's Notino site per query. Higher values catch more variants but take longer and cost more.",
                        "default": 10
                    },
                    "timeoutPerSourceSecs": {
                        "title": "Timeout Per Source (seconds)",
                        "minimum": 30,
                        "maximum": 600,
                        "type": "integer",
                        "description": "Maximum time to wait for each underlying Notino country scraper to finish. A slow or failing country is skipped after this and reported as an absence row rather than blocking the whole run.",
                        "default": 120
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings passed to the underlying Notino country scrapers. Each of those actors already runs its own Bright Data Web Unlocker for the Cloudflare wall; this proxy is only used for their best-effort direct fallback."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
