# Glossier Deal Alert & Scraper (`mrdoe/glossier-deal-alert`) Actor

Glossier product scraper and deal alert: search any item on Glossier's own store, get price, description, images and stock, with new-product and price-drop alerts. Filter by price. No login.

- **URL**: https://apify.com/mrdoe/glossier-deal-alert.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 product returneds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Glossier Deal Alert & Scraper - product listings with price, stock and new-product alerts](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glossier-deal-alert--hero.png)

### What does Glossier Deal Alert & Scraper do?

Glossier Deal Alert & Scraper searches Glossier's own online store for any item and collects the matching products. Each row has the title, price, currency, description, category, stock status, photos, when it was listed, and the product link. Add several search terms, filter by minimum and maximum price, and turn on monitor mode so a scheduled run returns only products that are new or whose price dropped since the previous run.

### Why use Glossier Deal Alert & Scraper?

- Catch Glossier restocks and price changes the moment they happen instead of refreshing the site.
- Track several searches at once with separate limits and a shared price range.
- Price-drop alerts show when an already-seen product becomes cheaper.
- Clean structured rows for resellers, price trackers, spreadsheets and Telegram or Discord bots.
- No account or login needed.

### What makes this different

Reads straight from Glossier's own store rather than a secondhand marketplace, so prices, stock and photos are always current. Built for hunting deals rather than one-off exports: it searches many terms in one run, keeps a baseline per search between runs, and reports only new products and real price drops in monitor mode.

### How it works

![Glossier Deal Alert & Scraper workflow: your input, collection, output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glossier-deal-alert--how-it-works.png)

1. **Your input** — type one or more search terms and optional price filters.
2. **The Actor collects it** — the Actor searches Glossier's store for each term, across the full matching catalog, and applies your filters.
3. **Your output** — you get one clean row per product, or only new products and price drops in monitor mode.

### What data can you extract?

The dataset has 20 fields per row:

| Field              | Type    | Description                                                                      |
| ------------------ | ------- | -------------------------------------------------------------------------------- |
| `id`               | string  | Glossier product ID.                                                             |
| `title`            | string  | Product title.                                                                   |
| `url`              | string  | Product page.                                                                    |
| `price`            | number  | Price in USD.                                                                    |
| `currency`         | string  | ISO currency code.                                                               |
| `description`      | string  | Product description.                                                             |
| `location`         | string  | Always null - a single-store product, not a marketplace listing.                 |
| `city`             | string  | Always null - a single-store product, not a marketplace listing.                 |
| `category`         | string  | Product category.                                                                |
| `condition`        | string  | Always "new".                                                                    |
| `sellerName`       | string  | Always "Glossier".                                                               |
| `isShippable`      | boolean | Always null - not stated at catalog level.                                       |
| `postedAt`         | string  | When the product was published (ISO 8601 UTC).                                   |
| `imageUrl`         | string  | Main image URL.                                                                  |
| `imageUrls`        | array   | Up to 10 image URLs.                                                             |
| `attributes`       | array   | Compare-at price, discount percent, variant count and stock as name/value pairs. |
| `searchTerm`       | string  | The search term that found the product.                                          |
| `priceDropAmount`  | number  | How much cheaper than the previous run; null if not cheaper.                     |
| `priceDropPercent` | number  | Percent cheaper than the previous run.                                           |
| `isNewToWatch`     | boolean | True the first time this product appears in this search.                         |

### How to use Glossier Deal Alert & Scraper

![Glossier Deal Alert & Scraper input form](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glossier-deal-alert--input.png)

1. Open the Actor and go to the **Input** tab.
2. Enter one or more **Search terms**, for example `balm dotcom`.
3. Optionally set filters and a **Max results** limit.
4. Click **Start**. A default run finishes in under a minute.
5. Open the **Output** tab, then download the dataset or connect it to your tools.

### Input Parameters

| Parameter            | Type    | Required | Default           | Description                                                                                                                                                                                                 |
| -------------------- | ------- | -------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `searchTerms`        | array   | No       | `["balm dotcom"]` | One or more things to search Glossier for, e.g. "balm dotcom". Matched against each product's title, type and tags. Max results applies to each term separately.                                            |
| `minPrice`           | number  | No       | —                 | Only return products priced at or above this amount in USD.                                                                                                                                                 |
| `maxPrice`           | number  | No       | —                 | Only return products priced at or below this amount in USD.                                                                                                                                                 |
| `sortBy`             | string  | No       | `"relevance"`     | Order of the results.                                                                                                                                                                                       |
| `maxItems`           | integer | No       | `20`              | Stop once this many products have been written to the dataset for each search term.                                                                                                                         |
| `monitorMode`        | boolean | No       | `false`           | When on, the run compares against the previous monitored run of the same search and returns only products that are new or whose price fell by at least the drop threshold. Turn this on for scheduled runs. |
| `minDropPercent`     | number  | No       | `5`               | In monitor mode, report a price drop on an already-seen product only when it is at least this many percent.                                                                                                 |
| `proxyConfiguration` | object  | No       | —                 | Default works for most runs. Turn on Apify Proxy if you see blocked requests.                                                                                                                               |

### Output Data

![Glossier Deal Alert & Scraper dataset table](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glossier-deal-alert--output.png)

Prices are numbers in USD. `postedAt` is ISO 8601 UTC from Glossier's own catalog data. Fields a product doesn't have, such as `location` or `sellerName` beyond the brand itself, are `null`.

![Glossier Deal Alert & Scraper field map of one record](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glossier-deal-alert--fields.png)

A real dataset item:

```json
{
    "id": "9151050449141",
    "title": "Balm Dotcom Trio",
    "url": "https://glossier.com/products/balm-dotcom-trio",
    "price": 42,
    "currency": "USD",
    "description": "universal skin salve, lip care, lip balm, glossier balm dotcom",
    "location": null,
    "city": null,
    "category": "Balms",
    "condition": "new",
    "sellerName": "Glossier",
    "isShippable": null,
    "postedAt": "2026-07-21T10:32:54-04:00",
    "imageUrl": "https://cdn.shopify.com/s/files/1/0627/9164/7477/files/BDC_Trio_-_I_3NY_birthday_blackcherry.png?v=1788208005",
    "imageUrls": [
        "https://cdn.shopify.com/s/files/1/0627/9164/7477/files/BDC_Trio_-_I_3NY_birthday_blackcherry.png?v=1788208005",
        "https://cdn.shopify.com/s/files/1/0627/9164/7477/files/glossier-iheartny-bdc-trio-carousel-02_427b3436-63a6-423a-9838-446fcb39a972_02.png?v=1790214437",
        "https://cdn.shopify.com/s/files/1/0627/9164/7477/files/glossier-iheartny-bdc-trio-carousel-04_1aaa8b8e-d2ee-4161-a328-99666fe46ce5.png?v=1784582723",
        "https://cdn.shopify.com/s/files/1/0627/9164/7477/files/glossier-iheartny-bdc-trio-carousel-05_66da3348-9ae3-4638-aa45-b2981b8973d3.png?v=1784582722"
    ],
    "attributes": [
        {
            "name": "compareAtPrice",
            "value": 48
        },
        {
            "name": "discountPercent",
            "value": 13
        },
        {
            "name": "variantCount",
            "value": 1
        },
        {
            "name": "inStock",
            "value": true
        }
    ],
    "searchTerm": "balm dotcom",
    "priceDropAmount": null,
    "priceDropPercent": null,
    "isNewToWatch": true
}
```

### Usage Examples

#### Latest "balm dotcom" products

```json
{
    "searchTerms": ["balm dotcom"]
}
```

#### "skin tint" under $40

```json
{
    "searchTerms": ["skin tint"],
    "maxPrice": 40,
    "sortBy": "price_asc"
}
```

#### Hourly alert for new products and price drops

```json
{
    "searchTerms": ["balm dotcom", "skin tint", "blush"],
    "monitorMode": true,
    "maxItems": 50
}
```

### Tips for Best Results

- Schedule monitor mode every 10 to 60 minutes and send new rows to Telegram, Discord or Slack.
- Use a specific product line name (e.g. "cloud paint" or "futuredew") to keep results relevant.
- Keep the same search terms and price range between scheduled runs - the baseline is kept per search.
- Default is 5 results for a fast test. Set the max to 0 to return everything available.

### Known Limitations

- Prices are read live from Glossier's own public catalog.
- Each row is one product; its price is the cheapest variant currently listed.
- The store has no full-text search of its own, so a search term is matched against each product's title, type and tags.
- Monitor mode re-scans the whole matching catalog on every run.
- Prices are in USD and are not converted.
- Discontinued products disappear from the catalog, so they are not reported.

### Integrations

Run it from the Apify API, on a schedule, or from a webhook. Send results straight to Google Sheets, Make, Zapier, Slack or your own database with Apify's built-in integrations.

### Export Formats

Download the dataset as JSON, CSV, Excel, XML, HTML table or RSS from the **Output** tab or the API.

### Frequently Asked Questions

#### How do I scrape Glossier products?

Enter one or more search terms and run the Actor. Each matching product is returned with price, description, images and stock.

#### How do I get alerts for new products?

Turn on Monitor mode and schedule the run. Each run returns only products that earlier runs of the same search did not report.

#### Can I get price-drop alerts?

Yes. In monitor mode a product you have seen before is returned again when its price falls by at least your threshold.

#### Can I filter by price?

Yes. Set a minimum and maximum price in USD.

#### How many results can I get?

The default is 20 products per search term. Raise Max results to collect more; the store's own catalog size limits how many can be found.

#### How fresh is the data?

It is read live from Glossier's store on every run.

#### Does it remove duplicates?

Yes. Each product appears once per run.

#### Do I need an account or login?

No. The Actor reads Glossier's own public catalog and needs no account, cookies or API key.

#### Am I charged for failed runs or empty results?

You are only charged for results that are actually written to the dataset.

#### Can I run it on a schedule?

Yes. Create a Task with your input and add a schedule in Apify Console. With monitor mode on, each scheduled run returns only what changed since the previous one.

### Support

Questions or a missing field? Open an issue from the **Issues** tab on this Actor's page and it will be looked at.

### Legal / Responsible Use

You are responsible for using the collected data in line with Glossier's terms and applicable law. The Actor is not affiliated with Glossier.

# Actor input Schema

## `searchTerms` (type: `array`):

One or more things to search Glossier for, e.g. "balm dotcom". Matched against each product's title, type and tags. Max results applies to each term separately.

## `minPrice` (type: `number`):

Only return products priced at or above this amount in USD.

## `maxPrice` (type: `number`):

Only return products priced at or below this amount in USD.

## `sortBy` (type: `string`):

Order of the results.

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

Stop once this many products have been written to the dataset for each search term.

## `monitorMode` (type: `boolean`):

When on, the run compares against the previous monitored run of the same search and returns only products that are new or whose price fell by at least the drop threshold. Turn this on for scheduled runs.

## `minDropPercent` (type: `number`):

In monitor mode, report a price drop on an already-seen product only when it is at least this many percent.

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

Default works for most runs. Turn on Apify Proxy if you see blocked requests.

## Actor input object example

```json
{
  "searchTerms": [
    "balm dotcom"
  ],
  "sortBy": "relevance",
  "maxItems": 20,
  "monitorMode": false,
  "minDropPercent": 5
}
```

# 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 = {
    "searchTerms": [
        "balm dotcom"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/glossier-deal-alert").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 = {
    "searchTerms": ["balm dotcom"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/glossier-deal-alert").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "balm dotcom"
  ],
  "maxItems": 20
}' |
apify call mrdoe/glossier-deal-alert --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/glossier-deal-alert"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/88sIY1gLTudZYn5g1/builds/rUbcmg55JzguXFMDg/openapi.json
