# Credo Beauty Scraper - Products, Prices, SKUs & Barcodes (`growth-installations/credo-beauty-scraper`) Actor

Scrape the Credo Beauty clean-beauty catalogue: products, brands, prices, discounts, variant SKUs and GTIN barcodes, stock status, store taxonomy and merchandised bestseller rank. Five modes: full catalogue, collections, product URLs, search. Barcodes join to other retailers for price intelligence.

- **URL**: https://apify.com/growth-installations/credo-beauty-scraper.md
- **Developed by:** [Growth Installations](https://apify.com/growth-installations) (community)
- **Categories:** E-commerce, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 product records

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.

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

Scrape the full [Credo Beauty](https://credobeauty.com) clean-beauty catalog as structured, analysis-ready product data. This Shopify-native, delta-aware scraper returns brands, prices, promotions, variant-level SKUs, GTIN/UPC/EAN barcodes, ingredient lists, stock status, the store taxonomy, and the merchandised bestseller rank per collection.

Built for competitive-intelligence teams, price-monitoring vendors, retailer buyers evaluating clean-beauty assortment, and POS or PIM integrators that need barcode-anchored product records they can reconcile against other retailers.

### What this Credo Beauty scraper extracts

Each run produces one row per product record with the following fields:

- **title, handle, vendor (brand)** – canonical product identity
- **price, compareAtPrice, discount** – current price plus original price when on promotion
- **variantId, sku, barcode (GTIN/UPC/EAN)** – returned when Enrich with variant detail is enabled
- **inventoryPolicy, available, stockStatus** – per-variant availability
- **productType, tags, collections** – Shopify taxonomy and merchandising signals
- **description, ingredients, cleanBeautyCertifications** – long-form editorial and compliance detail
- **images, url** – full asset URLs and canonical product link
- **position, feedPosition, collectionHandle, page** – merchandised bestseller rank for collection and search modes
- **publishedAt, updatedAt** – Shopify timestamps for delta comparisons

### Five modes

| Mode | What it does | Typical use |
| --- | --- | --- |
| **All products** | Whole catalogue, paginated | Nightly census, new-launch detection |
| **Collections** | Products inside chosen collections, in merchandised order | Category rank tracking |
| **Collection list** | The store taxonomy (~740 collections) | Category mapping |
| **Product URLs** | Specific products, richest payload | Competitor SKU watchlists |
| **Search** | Products matching search queries | Share-of-search, keyword visibility |

### Why the barcode matters

Credo's internal SKUs (`2100000xxxxx`) are meaningless outside Credo. A barcode (GTIN/UPC/EAN) identifies the same physical product at every other retailer, so it is the join key that lets this dataset be compared against other price sources.

Barcodes are returned when **Enrich with variant detail** is enabled.

### How to use

1. **Choose a mode** in the Input tab. Start with "All products" for a full sweep, or "Collection list" if you want to explore the taxonomy first.
2. **Paste inputs** into the field that matches your mode. Collection handles, product URLs, or search queries each have their own field, and the actor only reads the one relevant to the mode you picked.
3. **Set limits** using Max items (default 100, set 0 for the full catalog of roughly 2000 products) and toggle Enrich with variant detail if you need barcodes and per-variant SKUs.
4. **Run** the actor and open the Dataset tab. Download in JSON, CSV, Excel, or XML, or pipe the dataset ID into your warehouse via the Apify API.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `mode` | string (enum) | One of `all_products`, `collections`, `collection_list`, `product_urls`, `search`. |
| `collectionHandles` | array of strings | Used by Collections mode. Accepts a handle or a full collection URL. |
| `productUrls` | array of strings | Used by Product URLs mode. Accepts a full product URL or just the handle. |
| `searchQueries` | array of strings | Used by Search mode. One query per line. Shopify returns at most 10 products per query. |
| `enrichWithVariants` | boolean | Runs a second pass to attach SKU, barcode, inventory policy, and per-variant price and stock. The only way to get SKUs in Search mode. |
| `includePromotional` | boolean | Include gift-with-purchase and loyalty placeholder items. Off by default. Genuine house brands ("Credo Beauty", "Credo Skincare") are always kept. |
| `maxProducts` | integer | Stop after this many items. Set to 0 for unlimited. Default 100. |
| `proxyConfiguration` | object | Optional. Apify Proxy is recommended for large runs. |

### Output

Example record (trimmed):

```json
{
  "title": "Multi-Retinol Night Emulsion",
  "handle": "multi-retinol-night-emulsion",
  "vendor": "OSEA",
  "price": 78.00,
  "compareAtPrice": null,
  "discount": 0,
  "variantId": "44127885361342",
  "sku": "210000012345",
  "barcode": "850004321089",
  "available": true,
  "stockStatus": "in_stock",
  "productType": "Serum",
  "tags": ["clean", "vegan", "cruelty-free"],
  "collectionHandle": "skincare-bestsellers",
  "position": 7,
  "feedPosition": 9,
  "page": 1,
  "url": "https://credobeauty.com/products/multi-retinol-night-emulsion"
}
````

### Pricing and cost estimation

This actor uses PAY\_PER\_EVENT pricing at **$0.003 per product record** on the FREE tier, tiered down to **$0.002 per product** for GOLD and higher plans, plus a small actor-start fee per run.

Credo's full catalog is roughly 2000 products, so a full sweep costs about **$6 on FREE** or **$4 on GOLD+**. A typical bestsellers-only sweep of a handful of collections finishes for well under a dollar.

### Tips

- **Enable Enrich with variant detail** whenever you need barcodes or per-variant SKUs. Without it you get product-level data only, which is fine for merchandising analysis but not for cross-retailer reconciliation.
- **Run Collection list mode first** on new projects. It returns the ~740-collection taxonomy and lets you pick the exact handles worth deep-scraping in Collections mode.
- **Leave `includePromotional` off** unless you are specifically tracking Credo's loyalty-rewards program or gift bundles. It filters out "Free Gift" and "Credo Rewards" placeholder rows.
- **Keep Apify Proxy enabled** on any run above a few hundred products to avoid rate-limit throttling.

### FAQ, disclaimers, and support

**Is scraping Credo Beauty legal?** This actor reads only public product pages served by Credo's Shopify storefront, with no circumvention of access controls or logins. You are responsible for ensuring your downstream use complies with applicable law and the site's terms.

**Does it need a Credo account?** No. All data comes from public Shopify endpoints.

**Something broke or a field looks wrong?** Open an issue on the Actor's Issues tab and it will be triaged. Custom scraping solutions, alternate output schemas, and enterprise SLAs are available on request through the publisher profile.

# Actor input Schema

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

What to scrape. Each mode uses a different Shopify endpoint and only reads its own field below.

## `collectionHandles` (type: `array`):

Used by Collections mode. Accepts a handle or a full collection URL.

## `productUrls` (type: `array`):

Used by Product URLs mode. Accepts a full product URL or just the handle.

## `searchQueries` (type: `array`):

Used by Search mode. One query per line. Shopify returns at most 10 products per query.

## `enrichWithVariants` (type: `boolean`):

Runs a second pass that re-fetches every product from its .js endpoint to attach full variant rows: SKU, barcode (GTIN/UPC/EAN), inventory policy and per-variant price and stock. This is the only way to get SKUs in Search mode, and it adds barcodes to every other product mode. Costs one extra request per product.

## `includePromotional` (type: `boolean`):

Credo lists gift-with-purchase and loyalty placeholders as products, whose vendor shows up as 'Free Gift' or 'Credo Rewards'. These are excluded by default. Note that 'Credo Beauty' and 'Credo Skincare' are genuine house brands and are always kept.

## `maxProducts` (type: `integer`):

Stop after this many items. Set to 0 for unlimited (the full catalogue is roughly 1,200 products).

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

Optional. Apify Proxy is recommended for large runs.

## Actor input object example

```json
{
  "mode": "all_products",
  "collectionHandles": [
    "skincare-bestsellers",
    "makeup-bestsellers"
  ],
  "productUrls": [
    "https://credobeauty.com/products/multi-retinol-night-emulsion"
  ],
  "searchQueries": [
    "vitamin c serum",
    "clean sunscreen"
  ],
  "enrichWithVariants": false,
  "includePromotional": false,
  "maxProducts": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "collectionHandles": [
        "skincare-bestsellers",
        "makeup-bestsellers"
    ],
    "productUrls": [
        "https://credobeauty.com/products/multi-retinol-night-emulsion"
    ],
    "searchQueries": [
        "vitamin c serum",
        "clean sunscreen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("growth-installations/credo-beauty-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 = {
    "collectionHandles": [
        "skincare-bestsellers",
        "makeup-bestsellers",
    ],
    "productUrls": ["https://credobeauty.com/products/multi-retinol-night-emulsion"],
    "searchQueries": [
        "vitamin c serum",
        "clean sunscreen",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("growth-installations/credo-beauty-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 '{
  "collectionHandles": [
    "skincare-bestsellers",
    "makeup-bestsellers"
  ],
  "productUrls": [
    "https://credobeauty.com/products/multi-retinol-night-emulsion"
  ],
  "searchQueries": [
    "vitamin c serum",
    "clean sunscreen"
  ]
}' |
apify call growth-installations/credo-beauty-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Credo Beauty Scraper - Products, Prices, SKUs & Barcodes",
        "description": "Scrape the Credo Beauty clean-beauty catalogue: products, brands, prices, discounts, variant SKUs and GTIN barcodes, stock status, store taxonomy and merchandised bestseller rank. Five modes: full catalogue, collections, product URLs, search. Barcodes join to other retailers for price intelligence.",
        "version": "0.0",
        "x-build-id": "6EaFQBJDXWxIaGh1B"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/growth-installations~credo-beauty-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-growth-installations-credo-beauty-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/growth-installations~credo-beauty-scraper/runs": {
            "post": {
                "operationId": "runs-sync-growth-installations-credo-beauty-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/growth-installations~credo-beauty-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-growth-installations-credo-beauty-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": [
                            "all_products",
                            "collections",
                            "collection_list",
                            "product_urls",
                            "search"
                        ],
                        "type": "string",
                        "description": "What to scrape. Each mode uses a different Shopify endpoint and only reads its own field below.",
                        "default": "all_products"
                    },
                    "collectionHandles": {
                        "title": "Collection handles",
                        "type": "array",
                        "description": "Used by Collections mode. Accepts a handle or a full collection URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "productUrls": {
                        "title": "Product URLs",
                        "type": "array",
                        "description": "Used by Product URLs mode. Accepts a full product URL or just the handle.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Used by Search mode. One query per line. Shopify returns at most 10 products per query.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichWithVariants": {
                        "title": "Enrich with variant detail (SKU + barcode)",
                        "type": "boolean",
                        "description": "Runs a second pass that re-fetches every product from its .js endpoint to attach full variant rows: SKU, barcode (GTIN/UPC/EAN), inventory policy and per-variant price and stock. This is the only way to get SKUs in Search mode, and it adds barcodes to every other product mode. Costs one extra request per product.",
                        "default": false
                    },
                    "includePromotional": {
                        "title": "Include promotional / placeholder items",
                        "type": "boolean",
                        "description": "Credo lists gift-with-purchase and loyalty placeholders as products, whose vendor shows up as 'Free Gift' or 'Credo Rewards'. These are excluded by default. Note that 'Credo Beauty' and 'Credo Skincare' are genuine house brands and are always kept.",
                        "default": false
                    },
                    "maxProducts": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many items. Set to 0 for unlimited (the full catalogue is roughly 1,200 products).",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Apify Proxy is recommended for large runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
