# Fourthwall Shop Products & Price Monitor (`luminar/fourthwall-shop-products-monitor`) Actor

Export public Fourthwall shop products, variants, prices, stock, descriptions and images, or track reliable catalog changes with explicit coverage.

- **URL**: https://apify.com/luminar/fourthwall-shop-products-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** E-commerce, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 core fourthwall products

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?

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

### 🚀 Start in 60 seconds

1. Keep **Collect current products** selected.
2. Paste one or more public Fourthwall shop URLs, including creator custom domains.
3. Choose **Detailed product rows** for descriptions, brand, all images, and per-variant stock.
4. Set **Maximum products** and **Maximum buyer charge** to the limits you want.
5. Click **Start** and open the Dataset.

The default run exports up to 50 detailed products from Fourthwall's own public demo shop. No creator login, API key, Storefront token, account cookie, customer data, or order access is required.

```json
{
  "workflow": "collect",
  "shopUrls": ["https://shop.fourthwall.com"],
  "detailLevel": "detailed",
  "maxProducts": 50
}
```

![Actual Fourthwall product Dataset preview](./assets/readme/fourthwall-products-dataset.png)

### 🎯 Choose the right workflow

**Collect current products** returns one normalized row per unique public product. It is designed for creator-commerce research, assortment comparisons, price tracking, product-feed QA, and catalog exports.

**Track product changes** creates or compares a private baseline for the same targets, detail level, limits, and monitoring scope name. It reports `NEW`, `UPDATED`, and only after two complete comparable absences, `ENDED`.

Use exact product URLs when you need a small watchlist instead of a whole shop. Shop and exact-product targets can be combined in one run and are deduplicated by Fourthwall's stable public product ID.

### 📦 What you get

Every product row can include:

- stable product and variant UUIDs;
- canonical shop and product URLs, including custom domains;
- product title, handle, description, brand, and product-level SKU;
- current and compare-at price with currency;
- product and per-variant availability;
- every public variant title, price, currency, availability, and link;
- primary image and all public product images;
- source-published creation and update timestamps;
- explicit detail and coverage status.

The mixed Dataset also contains one free coverage row. Monitoring runs return deterministic change rows with before/after snapshots and the exact fields that changed.

### 🎛️ Input guide

- **Fourthwall shop URLs** accepts normal Fourthwall subdomains and creator custom domains.
- **Exact product URLs** accepts public `/products/...` pages.
- **Detail level** chooses a low-request catalog export or one public detail request per product.
- **Maximum products**, **Maximum products per shop**, **Maximum catalog pages**, and **Maximum detailed products** bound work and output.
- **Monitoring scope name** separates independent baselines. Keep it unchanged for comparable repeat runs.
- **First monitoring run** either seeds silently or returns every current product as `NEW`.
- **Maximum buyer charge** is a hard preflight guard, not a spending target.

### 💰 Pricing

This Actor uses pay-per-event pricing. Failed and blocked targets produce no paid product rows and never advance monitoring state.

| Delivered value | Free-tier price |
|---|---:|
| Verified public shop or exact-product target | $0.0025 |
| Core catalog product | $0.002 |
| Detailed product | $0.003 |
| Comparable monitoring target | $0.003 |
| Delivered product change | $0.002 |

Core and Detailed product prices are mutually exclusive. A 100-product Detailed export from one shop is $0.3025 before Apify platform usage; the same Core export is $0.2025. Your input charge guard can stop the run before source work begins.

### ✅ Coverage you can trust

Each run reports one of these states:

- `COMPLETE`: every requested public target was exhausted within your limits;
- `CAPPED`: a product, page, request, transfer, or runtime limit stopped full traversal;
- `PARTIAL`: useful results were returned, but at least one target failed or was blocked;
- `BLOCKED`: the public target denied access; it is not called empty;
- `FAILED`: the expected Fourthwall public product contract was not reached;
- `EMPTY_CONFIRMED`: the expected public surface loaded and explicitly contained no products.

Only `COMPLETE` and `EMPTY_CONFIRMED` coverage can update monitoring state or advance a missing product toward `ENDED`. Duplicate products from overlapping shop and exact-product inputs are merged before billing.

### 🔌 API and automation

Run the Actor from Apify Console, API, CLI, Make, Zapier, Google Sheets, webhooks, or another Apify integration. The Dataset is exportable as JSON, CSV, Excel, XML, RSS, or HTML.

For monitoring, use the same saved input and `stateNamespace` on repeat runs. Scheduling and downstream notification delivery are handled through Apify's standard automation surfaces; this Actor does not ask for third-party webhook secrets or email credentials.

### ⚠️ Not yet supported

- private, hidden, archived, login-only, or password-protected products;
- creator dashboard analytics, orders, customers, memberships, or payouts;
- discovery of all Fourthwall creators or shops from a keyword;
- arbitrary collection-handle selection beyond the complete public `all` catalog;
- shipping quotes, taxes, checkout actions, or cart mutation;
- guaranteed stock quantity when Fourthwall publishes only availability.

Secondary fields such as compare-at price, product-level SKU, brand, and timestamps remain `null` when a public shop does not publish them.

### ❓ FAQ and support

**Does it need a Fourthwall token?** No. It uses only public shop surfaces Fourthwall documents for public product integration.

**Do custom domains work?** Yes, when the domain serves the verified Fourthwall public catalog contract. MKBHD and New York Magazine custom-domain shops are part of the source test set.

**Why did my run say CAPPED?** A declared input or safety limit was reached. Narrow the shop set or raise the relevant limit and buyer-charge guard deliberately.

**Can a temporary failure remove products from my monitor?** No. Blocked, failed, partial, or capped runs do not infer removal. `ENDED` requires two complete comparable misses.

For a reproducible issue, share the public shop or product URL, workflow, detail level, coverage status, and run ID. Never share login credentials, cookies, private tokens, customer data, or order data.

# Actor input Schema

## `workflow` (type: `string`):

Collect returns current public products. Track changes creates or compares a baseline.

## `shopUrls` (type: `array`):

Public Fourthwall shop domains, including creator custom domains. The Actor verifies the public Fourthwall catalog contract before returning rows.

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

Maximum unique current products across every requested shop and exact product target.

## `maxBuyerChargeUsd` (type: `number`):

The Actor refuses to start if the active worst-case event-price vector exceeds this amount.

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

Public Fourthwall product links on creator domains. Login-only, hidden, archived, customer, and order data are never accessed.

## `firstRunBehavior` (type: `string`):

This choice does not add source work or runtime and does not change the monitoring-target price. Seed only creates a Baseline with no paid change rows; Return current products as NEW emits Changes and each delivered row uses the change-row price.

## `stateNamespace` (type: `string`):

Separates independent baselines. Keep this unchanged for repeat runs of the same shop set and limits.

## `detailLevel` (type: `string`):

Detailed opens each public product page, adding source requests and runtime. In Collect, complete Detailed rows use the detailed-row price while source-valid fallbacks use the cheaper Core price; in Track changes, delivered Changes use the change-row price and detail pages add only source work and runtime.

## `maxProductsPerShop` (type: `integer`):

Maximum products kept from each shop before coverage becomes CAPPED.

## `maxPagesPerShop` (type: `integer`):

Maximum public catalog pages requested per shop.

## `maxDetailRequests` (type: `integer`):

Used only by Detailed mode. Maximum products cannot exceed this value in Detailed mode.

## Actor input object example

```json
{
  "workflow": "collect",
  "shopUrls": [
    "https://shop.fourthwall.com"
  ],
  "maxProducts": 50,
  "maxBuyerChargeUsd": 1,
  "firstRunBehavior": "seed_only",
  "stateNamespace": "default",
  "detailLevel": "detailed",
  "maxProductsPerShop": 250,
  "maxPagesPerShop": 15,
  "maxDetailRequests": 50
}
```

# Actor output Schema

## `dataset` (type: `string`):

All product, change, and coverage rows.

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

Buyer-focused public product and variant fields.

## `changes` (type: `string`):

NEW, UPDATED, and confirmed ENDED change fields.

## `coverage` (type: `string`):

Completeness and monitoring safety.

## `runSummary` (type: `string`):

Counts, field coverage, limits, and billing events.

# 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 = {
    "workflow": "collect",
    "shopUrls": [
        "https://shop.fourthwall.com"
    ],
    "maxProducts": 50,
    "maxBuyerChargeUsd": 1,
    "firstRunBehavior": "seed_only",
    "stateNamespace": "default",
    "detailLevel": "detailed",
    "maxProductsPerShop": 250,
    "maxPagesPerShop": 15,
    "maxDetailRequests": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/fourthwall-shop-products-monitor").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 = {
    "workflow": "collect",
    "shopUrls": ["https://shop.fourthwall.com"],
    "maxProducts": 50,
    "maxBuyerChargeUsd": 1,
    "firstRunBehavior": "seed_only",
    "stateNamespace": "default",
    "detailLevel": "detailed",
    "maxProductsPerShop": 250,
    "maxPagesPerShop": 15,
    "maxDetailRequests": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("luminar/fourthwall-shop-products-monitor").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 '{
  "workflow": "collect",
  "shopUrls": [
    "https://shop.fourthwall.com"
  ],
  "maxProducts": 50,
  "maxBuyerChargeUsd": 1,
  "firstRunBehavior": "seed_only",
  "stateNamespace": "default",
  "detailLevel": "detailed",
  "maxProductsPerShop": 250,
  "maxPagesPerShop": 15,
  "maxDetailRequests": 50
}' |
apify call luminar/fourthwall-shop-products-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luminar/fourthwall-shop-products-monitor"
        }
    }
}

```

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/qZf5gnZkcyPSJtobP/builds/qkGHWmRnihhoBeNCc/openapi.json
