# Open Beauty Facts Scraper (`crawlerbros/open-beauty-facts-scraper`) Actor

Scrape Open Beauty Facts - the world's largest open database of cosmetics and beauty products. Search by name or brand, browse by category (shampoos, moisturisers, lip balms, etc.), or look up products by barcode. Returns ingredients, brands, categories, images, and countries.

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

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Scrape [Open Beauty Facts](https://world.openbeautyfacts.org) — the world's largest open database of cosmetics and personal care products, contributed by volunteers worldwide. Search by product name, browse by category (shampoos, moisturizers, lipsticks, etc.), or look up products by barcode. Extracts ingredients, brands, categories, countries, and product images.

### What you can do

- **Search by keyword** — find beauty products by name or brand (e.g. "shampoo", "face cream")
- **Browse by category** — paginate through specific categories like shampoos, mascaras, foundations, sunscreens, and 16+ more
- **Look up by barcode** — retrieve exact product details using EAN/UPC barcode numbers

### Output fields

| Field | Description |
|-------|-------------|
| `barcode` | EAN/UPC product barcode |
| `productName` | Product name |
| `brand` | Brand name |
| `quantity` | Product quantity/size (e.g. "250 ml") |
| `categories` | Raw category string from Open Beauty Facts |
| `categoryTags` | Cleaned list of category tags |
| `ingredients` | Full ingredients text list |
| `packaging` | Packaging type description |
| `origins` | Declared origin of the product/ingredients, when reported |
| `labels` | Certifications/labels (e.g. "Vegan", "Organic") |
| `labelTags` | Cleaned list of label tags |
| `countries` | Countries where the product is sold |
| `countryTags` | Cleaned list of country tags |
| `language` | Primary language of the product label |
| `imageUrl` | Front product image URL |
| `productUrl` | Link to the product on openbeautyfacts.org |
| `ecoscore` | Eco-score grade (a–e) if available |
| `allergens` | Declared allergens/irritants (e.g. "sesame seeds"), when reported |
| `veganStatus` | `vegan` / `non-vegan` / `maybe-vegan` / `unknown`, from Open Beauty Facts' ingredient analysis |
| `vegetarianStatus` | `vegetarian` / `non-vegetarian` / `maybe-vegetarian` / `unknown` |
| `palmOilStatus` | `palm-oil-free` / `palm-oil` / `may-contain-palm-oil` / `unknown` |
| `completeness` | Database completeness score (0–1) |
| `createdAt` | Date first added to Open Beauty Facts |
| `lastModifiedAt` | Date last updated |
| `scansCount` | Number of times the barcode was scanned in the mobile apps (popularity) |
| `uniqueScansCount` | Number of unique users who scanned the barcode |
| `sourceUrl` | URL of the API request |
| `scrapedAt` | UTC timestamp when scraped |
| `recordType` | Always `"beauty_product"` |

### Input options

#### Mode: `search` (default)

Search for beauty products by keyword.

```json
{
  "mode": "search",
  "searchQuery": "shampoo",
  "brand": "dove",
  "maxItems": 50
}
```

#### Mode: `byCategory`

Browse all products in a specific category.

```json
{
  "mode": "byCategory",
  "category": "moisturizers",
  "country": "france",
  "maxItems": 100
}
```

#### Mode: `byBarcode`

Look up specific products by EAN/UPC barcode.

```json
{
  "mode": "byBarcode",
  "barcodes": ["3600551020419", "8718114642871"]
}
```

### Filters

| Filter | Type | Description |
|--------|------|-------------|
| `brand` | string | Filter by brand (case-insensitive partial match) |
| `country` | string | Filter by country of sale (e.g. "france", "australia") |
| `hasIngredients` | boolean | Only include products with ingredients listed |
| `hasImage` | boolean | Only include products with a product image |
| `maxItems` | integer | Maximum number of records (1–1000) |

### Available categories

`shampoos`, `conditioners`, `foundations`, `mascaras`, `lipsticks`, `moisturizers`, `sunscreens`, `perfumes`, `nail-polishes`, `eye-shadows`, `blushes`, `concealers`, `serums`, `toners`, `cleansers`, `body-lotions`, `deodorants`, `hair-dyes`, `face-masks`, `bb-creams`

### Example output

```json
{
  "barcode": "8718114642871",
  "productName": "Cocoa Butter Lip Therapy",
  "brand": "Vaseline",
  "quantity": "20g",
  "categories": "non-food-products, open-beauty-facts",
  "categoryTags": ["non food products", "open beauty facts"],
  "ingredients": "PETROLATUM, THEOBROMA CACAO SEED BUTTER, AROMA, BENZYL ALCOHOL, BENZYL BENZOATE, BENZYL CINNAMATE, LIMONENE.",
  "packaging": "steel-tin,",
  "countries": "France, Morocco, United Kingdom",
  "countryTags": ["france", "morocco", "united kingdom"],
  "language": "en",
  "imageUrl": "https://images.openbeautyfacts.org/images/products/871/811/464/2871/front_en.15.400.jpg",
  "productUrl": "https://world.openbeautyfacts.org/product/8718114642871",
  "completeness": 0.8,
  "palmOilStatus": "unknown",
  "scansCount": 27,
  "uniqueScansCount": 24,
  "createdAt": "2021-01-18T12:28:11+00:00",
  "lastModifiedAt": "2026-02-16T19:36:52+00:00",
  "sourceUrl": "https://world.openbeautyfacts.org/api/v2/product/8718114642871.json",
  "scrapedAt": "2026-07-02T07:30:43+00:00",
  "recordType": "beauty_product"
}
```

### Use cases

- **Cosmetics research** — analyze ingredient lists across product categories for regulatory compliance or competitor intelligence
- **Beauty brand monitoring** — track which products a brand offers across countries
- **Ingredient analysis** — find all products containing specific ingredients (search by ingredient name)
- **E-commerce enrichment** — enrich product listings with ingredients, categories, and images
- **Sustainability research** — filter by eco-score to find eco-friendly products

### FAQ

**Is this free to use?**
Yes. Open Beauty Facts is an open, volunteer-driven database. This actor uses their public API with no authentication required.

**How many products are in the database?**
Open Beauty Facts contains hundreds of thousands of cosmetics and personal care products contributed by volunteers worldwide.

**Is the data reliable?**
Open Beauty Facts data is crowd-sourced. Product completeness varies — the `completeness` field (0–1) indicates how complete each record is.

**Can I search for products by ingredient?**
Yes — use `mode=search` with `searchQuery` set to the ingredient name (e.g. "retinol", "hyaluronic acid").

**Are prices included?**
No. Open Beauty Facts is a product database, not a shopping platform. Pricing data is not available.

**Which countries are covered?**
Open Beauty Facts has global coverage with particularly strong data for France, the United States, the United Kingdom, and Germany.

**Data source**: [Open Beauty Facts](https://world.openbeautyfacts.org) — open database of beauty and cosmetics products, available under the Open Database License (ODbL).

# Actor input Schema

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

What to fetch from Open Beauty Facts.

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

Product name or brand to search for (mode=search). Example: 'shampoo', 'face cream', 'L Oreal'.

## `category` (type: `string`):

Open Beauty Facts category slug (mode=byCategory). Common categories available in the dropdown.

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

EAN/UPC barcode numbers to look up. E.g. `3600524187644`.

## `brand` (type: `string`):

Filter results to a specific brand name (case-insensitive substring match). E.g. `loreal`, `maybelline`.

## `country` (type: `string`):

Filter products available in a specific country. E.g. `United States`, `France`, `United Kingdom`.

## `language` (type: `string`):

Filter products with labels in a specific language (ISO 639-1 code, e.g. `en`, `fr`, `de`).

## `hasIngredients` (type: `boolean`):

Only include products that have an ingredients list.

## `hasImage` (type: `boolean`):

Only include products that have a product image.

## `dietaryPreference` (type: `string`):

Only include products confirmed (not just 'maybe' or 'unknown') to match this dietary preference, based on Open Beauty Facts' own ingredient analysis.

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

Maximum number of product records to return.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "shampoo",
  "category": "lipsticks",
  "barcodes": [],
  "language": "",
  "hasIngredients": false,
  "hasImage": false,
  "dietaryPreference": "any",
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset containing all scraped beauty product records.

# 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 = {
    "mode": "search",
    "searchQuery": "shampoo",
    "barcodes": [],
    "hasIngredients": false,
    "hasImage": false,
    "dietaryPreference": "any",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/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 = {
    "mode": "search",
    "searchQuery": "shampoo",
    "barcodes": [],
    "hasIngredients": False,
    "hasImage": False,
    "dietaryPreference": "any",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/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 '{
  "mode": "search",
  "searchQuery": "shampoo",
  "barcodes": [],
  "hasIngredients": false,
  "hasImage": false,
  "dietaryPreference": "any",
  "maxItems": 20
}' |
apify call crawlerbros/open-beauty-facts-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Lp61ifRdpxldVfRg7/builds/p6uC3HAwdRiON91Ww/openapi.json
