# Open Beauty Facts Scraper — Cosmetics & Personal Care (`logiover/open-beauty-facts-scraper`) Actor

Scrape Open Beauty Facts by category, brand, or barcode. Extract ingredients, labels, countries, and images for cosmetics research, competitor analysis, and product databases. No API key, no login.

- **URL**: https://apify.com/logiover/open-beauty-facts-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

## Open Beauty Facts Scraper — Cosmetics, Ingredients & Personal Care Data API

Scrape Open Beauty Facts — the world's largest open cosmetics database — by category, brand, or barcode. No API key, no login required.

### What does Open Beauty Facts Scraper do?

Open Beauty Facts Scraper connects directly to [world.openbeautyfacts.org](https://world.openbeautyfacts.org), the collaborative, open-data cosmetics database that covers more than 250,000 personal care products worldwide. The actor uses the official Open Beauty Facts JSON API (v2) with a descriptive User-Agent and Apify datacenter proxies, so it runs fast, cheap, and reliably at scale.

In **search mode**, you supply one or more product categories (e.g., `shampoos`, `face-creams`, `lipsticks`) and optional brand filters (e.g., `loreal`, `dove`). The actor paginates the API at 100 products per page and pushes records until it hits your `maxResults` limit — or exhausts the catalogue. In **product mode**, you hand in a list of EAN/UPC barcodes and the actor fetches each product record individually. In **category mode**, you browse an entire category tree and get everything in it. Every run extracts barcode, product name, brand, category path, full ingredient list, labels (e.g., vegan, cruelty-free), period-after-opening, countries sold in, quantity/size, image URL, and the canonical product page URL.

### Who is it for?

- **Cosmetics formulators** who want competitive ingredient benchmarking across hundreds of SKUs.
- **E-commerce operators** building or enriching product catalogues with real ingredient and label data.
- **Regulatory researchers** tracking clean-beauty labels or country-specific availability.
- **Data scientists** building ingredient safety models, allergen detectors, or sustainability scorers.
- **Beauty bloggers and journalists** who need structured product data for reviews, roundups, or infographics.

### Use cases

- Extract all shampoos from a given brand and compare ingredient lists against competitors.
- Build a database of "vegan" or "cruelty-free" certified products across multiple categories.
- Monitor new product launches in a category by scheduling weekly runs and diffing the dataset.
- Enrich an existing product catalogue using barcodes — fill in missing ingredient or label fields.
- Research periods-after-opening (PAO) data across sunscreens or serums for safety reporting.

### Why use Open Beauty Facts Scraper?

- **No API key required** — Open Beauty Facts is public. Zero setup friction.
- **11 structured fields per product** — barcode, name, brands, categories, ingredients, labels, PAO, countries, quantity, image, URL.
- **Bulk extraction** — paginate to thousands of results in a single run.
- **Three flexible modes** — search by category/brand, look up individual barcodes, or browse entire category trees.
- **Export anywhere** — CSV, JSON, Excel, XML via Apify dataset export. Pipe directly to Google Sheets, Airtable, or your database.
- **Pay-per-result pricing** — you only pay for real product records pushed to the dataset.

### What data can you extract?

The scraper returns one row per product with the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `code` | string | EAN/UPC barcode (unique product identifier) |
| `productName` | string | Product name as listed on the packaging |
| `brands` | string | Brand or brand group (comma-separated if multiple) |
| `categories` | string | Category path (e.g. "Shampoos, Hair care, Cosmetics") |
| `ingredientsText` | string | Full ingredient list (INCI notation) |
| `labels` | string | Certification/label tags (e.g. "en:vegan, en:cruelty-free") |
| `periodsAfterOpening` | string | Period after opening (PAO) — e.g. "12M" for 12 months |
| `countries` | string | Countries the product is sold in (comma-separated tags) |
| `quantity` | string | Package size/quantity (e.g. "300 ml", "50 g") |
| `imageUrl` | string | Product image URL (hosted on openbeautyfacts.org) |
| `url` | string | Canonical Open Beauty Facts product page URL |

**Real output example:**

```json
{
  "code": "7350160451512",
  "productName": "Citrus Shampoo",
  "brands": "Blixt",
  "categories": "Shampoos",
  "ingredientsText": "Aqua (Water), Ammonium Lauryl Sulfate, Sodium Chloride, Parfum (Fragrance), Cocamidopropyl Betaine, Coco-Glucoside, Benzyl Alcohol, Sodium Benzoate, Sodium Cocoamphoacetate, Potassium Sorbate, Citric Acid, Propylene Glycol, Laminaria Digitata Extract, Limonene, Linalool",
  "labels": "en:no-parabens",
  "periodsAfterOpening": "12M",
  "countries": "en:norway",
  "quantity": "300ml",
  "imageUrl": "https://images.openbeautyfacts.org/images/products/735/016/045/1512/front_en.5.400.jpg",
  "url": "https://world.openbeautyfacts.org/product/7350160451512"
}
````

### How to use

#### Option A — Search by category and/or brand

1. Open the actor's **Input** tab.
2. Set **Mode** to `search`.
3. Enter one or more **Categories** (e.g., `shampoos`, `face-creams`, `moisturizers`).
4. Optionally add **Brands** to narrow results (e.g., `loreal`, `garnier`).
5. Set **Max Results** (e.g., 500) and click **Run**.

Input example:

```json
{
  "mode": "search",
  "categories": ["shampoos", "conditioners"],
  "brands": ["dove"],
  "maxResults": 300,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Option B — Look up products by barcode

1. Set **Mode** to `product`.
2. Enter your list of **Barcodes** (EAN-13 or UPC-A).
3. Click **Run** — each barcode fetches exactly one product record.

Input example:

```json
{
  "mode": "product",
  "barcodes": ["7350160451512", "3600550195132", "4066447909746"],
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Option C — Browse an entire category

1. Set **Mode** to `category`.
2. Enter the **Categories** you want to fully download.
3. Set **Max Results** or leave at 0 for all available.

Input example:

```json
{
  "mode": "category",
  "categories": ["lipsticks"],
  "maxResults": 0,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `"search"` | Scraping mode: `"search"`, `"product"`, or `"category"` |
| `categories` | array | `["shampoos"]` | Product categories to search or browse |
| `brands` | array | `[]` | Filter by brand (search mode only) |
| `barcodes` | array | `[]` | EAN/UPC barcodes to look up (product mode) |
| `maxResults` | integer | `200` | Maximum products to return. Set `0` for all. |
| `proxyConfiguration` | object | datacenter | Apify proxy settings |

Full input JSON:

```json
{
  "mode": "search",
  "categories": ["shampoos"],
  "brands": [],
  "barcodes": [],
  "maxResults": 200,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output example

```json
{
  "code": "3600550195132",
  "productName": "Shampoing Expert Force",
  "brands": "Frank Provost",
  "categories": "Shampoos",
  "ingredientsText": "Aqua, Sodium Laureth Sulfate, Cocamidopropyl Betaine, Glycerin, ...",
  "labels": "en:without-parabens",
  "periodsAfterOpening": "24M",
  "countries": "en:switzerland, en:france",
  "quantity": "250 ml",
  "imageUrl": "https://images.openbeautyfacts.org/images/products/360/055/019/5132/front_fr.3.400.jpg",
  "url": "https://world.openbeautyfacts.org/product/3600550195132"
}
```

### Tips for best results

- **Use specific categories** — Open Beauty Facts follows a taxonomy (e.g., `face-creams` rather than `creams`). Browse the site to confirm category slugs.
- **Combine category + brand filters** in search mode to get focused, high-quality datasets.
- **Set maxResults to 0** only if you need the full catalogue — it can reach tens of thousands of records per category.
- **Barcode mode is fastest** — if you already have EAN codes, product mode avoids pagination overhead entirely.
- **Schedule weekly runs** in search/category mode to track new product launches or updated ingredient lists.
- **Export to CSV or Excel** from the dataset for spreadsheet analysis or CRM import.
- **Null fields are normal** — Open Beauty Facts is community-maintained; some products have missing ingredient or label data.
- **Combine with Open Food Facts Scraper** if you also need food/supplement data — same platform, different domain.
- **Filter by country after extraction** using the `countries` field to build region-specific product lists.
- **Long ingredient texts** — `ingredientsText` can be several hundred characters; plan your storage/display accordingly.

### Integrations

Connect this actor to your workflow in minutes:

- **Google Sheets** — use Apify's native Google Sheets integration to sync the dataset into a spreadsheet automatically after each run.
- **Slack** — configure a webhook to send a Slack message when the run completes (e.g., "500 new shampoo records ready").
- **Zapier / Make (Integromat)** — trigger downstream automations: push products to Airtable, send to Mailchimp, or update a Shopify catalogue.
- **Webhooks** — Apify can POST the run results to any URL on completion. Use this to feed your own API or database pipeline.
- **Schedules** — set a cron schedule (daily, weekly) to keep your dataset fresh without manual intervention.

### API usage

**cURL:**

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/logiover~open-beauty-facts-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"search","categories":["shampoos"],"maxResults":200}'
```

**Node.js (Apify client):**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('logiover~open-beauty-facts-scraper').call({
  mode: 'search',
  categories: ['face-creams', 'moisturizers'],
  maxResults: 500,
});

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

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover~open-beauty-facts-scraper").call(
    run_input={"mode": "search", "categories": ["lipsticks"], "maxResults": 300}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Got {len(items)} products")
```

### Use with AI agents (MCP)

This actor is compatible with the Apify MCP Server, which lets AI agents like Claude or GPT-4 call it as a tool directly. An agent can run: *"Get me 200 shampoo products from Open Beauty Facts, then summarize which brands have the most vegan-labeled items"* — the MCP tool call triggers the actor, waits for results, and feeds the structured JSON directly back into the agent's context for analysis, summarization, or further processing.

### FAQ

#### Does this actor require an API key?

No. Open Beauty Facts is a public, open-access database. No registration, no API key, no login of any kind is required.

#### How many products does Open Beauty Facts have?

The database contains more than 250,000 cosmetics and personal care products contributed by a global community. Coverage is strongest for European brands (especially French, German, and UK markets) but includes products from over 180 countries.

#### How deep does pagination go?

The API supports up to 10,000 records per search query. For very large categories (e.g., `shampoos` has 1,700+ items), the actor paginates automatically at 100 per page until it reaches your `maxResults` or the dataset end.

#### What happens if a product returns null fields?

Open Beauty Facts is community-contributed, so some records are incomplete. Null fields (`ingredientsText`, `labels`, `quantity`) are expected and normal — the row is still pushed with the available data.

#### Can I filter by country?

The API doesn't directly support a country filter in search mode. Instead, set a high `maxResults`, then filter the output dataset by the `countries` field after extraction.

#### Why does the actor sometimes return fewer results than expected?

If a category name is misspelled or doesn't exist in the Open Beauty Facts taxonomy, the API returns 0 results. Check the correct slug by browsing the site (e.g., `face-creams`, not `face cream`).

#### How fast is a run?

A run returning 200 products typically completes in under 2 minutes with datacenter proxies. Larger runs (1,000+ records) take proportionally longer due to pagination.

#### How do I export results to CSV or Excel?

After the run completes, open the dataset tab in Apify and click **Export** — CSV, JSON, Excel, and XML are all available without any extra configuration.

#### Is the data updated in real time?

Open Beauty Facts is continuously updated by contributors. Running the scraper weekly ensures you capture new additions. The `url` field links to the canonical page where you can see the last-edit timestamp.

#### Can I scrape by brand alone without specifying a category?

Yes. In search mode, leave `categories` empty and set only `brands`. The actor will search the full catalogue filtered by brand.

#### How often should I run it?

For catalogue monitoring (new products, ingredient updates), weekly runs are a good cadence. For one-off research projects, a single run is sufficient.

#### Is this related to Open Food Facts?

Yes. Open Beauty Facts runs on the same platform as Open Food Facts (openfoodfacts.org) but focuses exclusively on cosmetics and personal care products. The API structure is identical.

### Is it legal?

Open Beauty Facts publishes all data under the [Open Database License (ODbL)](https://opendatacommons.org/licenses/odbl/). The product data is community-contributed and explicitly intended for public use, research, and integration. This actor accesses only publicly available API endpoints, sends a descriptive User-Agent identifying the actor and its operator, and does not circumvent any access controls. Use of this actor and the resulting data is subject to the Open Beauty Facts Terms of Use and the ODbL license terms.

### Related scrapers

- **Open Food Facts Scraper** — same platform, food and beverage products instead of cosmetics.
- **logiover/b2b-lead-scraper** — extract business contact data by industry and country for outreach campaigns.
- **logiover/linkedin-company-scraper** — scrape LinkedIn company pages without login for B2B intelligence.

# Actor input Schema

## `mode` (type: `string`):

Scraping mode: 'search' (by category/brand), 'product' (by barcode), or 'category' (browse a category).

## `categories` (type: `array`):

List of product categories to search (e.g. 'shampoos', 'face-creams', 'lipsticks'). Used in 'search' and 'category' modes.

## `brands` (type: `array`):

Filter results by brand names (e.g. 'loreal', 'dove', 'garnier'). Used in 'search' mode.

## `barcodes` (type: `array`):

List of product barcodes (EAN/UPC) to fetch. Used in 'product' mode.

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

Maximum number of products to return. Set 0 for unlimited. Default 200.

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

Apify proxy configuration. Datacenter proxies are sufficient for this API.

## Actor input object example

```json
{
  "mode": "search",
  "categories": [
    "shampoos"
  ],
  "brands": [],
  "barcodes": [],
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "SHADER"
    ]
  }
}
```

# Actor output Schema

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

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/open-beauty-facts-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("logiover/open-beauty-facts-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 '{}' |
apify call logiover/open-beauty-facts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/open-beauty-facts-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Open Beauty Facts Scraper — Cosmetics & Personal Care",
        "description": "Scrape Open Beauty Facts by category, brand, or barcode. Extract ingredients, labels, countries, and images for cosmetics research, competitor analysis, and product databases. No API key, no login.",
        "version": "1.0",
        "x-build-id": "zt4Mj3Gjvgj9ElRwc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~open-beauty-facts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-open-beauty-facts-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/logiover~open-beauty-facts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-open-beauty-facts-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/logiover~open-beauty-facts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-open-beauty-facts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "product",
                            "category"
                        ],
                        "type": "string",
                        "description": "Scraping mode: 'search' (by category/brand), 'product' (by barcode), or 'category' (browse a category).",
                        "default": "search"
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "List of product categories to search (e.g. 'shampoos', 'face-creams', 'lipsticks'). Used in 'search' and 'category' modes.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "shampoos"
                        ]
                    },
                    "brands": {
                        "title": "Brands",
                        "type": "array",
                        "description": "Filter results by brand names (e.g. 'loreal', 'dove', 'garnier'). Used in 'search' mode.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "barcodes": {
                        "title": "Barcodes",
                        "type": "array",
                        "description": "List of product barcodes (EAN/UPC) to fetch. Used in 'product' mode.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to return. Set 0 for unlimited. Default 200.",
                        "default": 200
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Datacenter proxies are sufficient for this API.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "SHADER"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
