# Faire Scraper - Wholesale Brands, Supplier Leads & Products (`parsebird/faire-scraper`) Actor

Extract wholesale brand leads and product data from Faire.com. Search by keyword or category, filter by brand values, country, and minimum products. Get contacts, minimums, ratings, and pricing.

- **URL**: https://apify.com/parsebird/faire-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.09 / 1,000 products

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/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

### Faire Scraper

Faire Scraper extracts wholesale brand leads and product data from [Faire.com](https://www.faire.com/) — the wholesale marketplace connecting independent brands with retailers. It's a **Faire API alternative** for sourcing supplier leads, monitoring competitor brands, and building product catalogs without manually browsing the marketplace.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword or category, filter by brand values (women-owned, eco-friendly, hand-made, and more), country, and minimum catalog size, and get full supplier profiles — minimums, lead times, reviews, Instagram, and a computed lead score — plus per-product pricing, SKUs, and GTINs.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

```
Use the Apify actor "parsebird/faire-scraper" (call it via the apify-client SDK, e.g. `ApifyClient(token).actor("parsebird/faire-scraper").call(run_input={...})`) to scrape wholesale brand leads and products from Faire.com. Key inputs: searchQueries (array of keywords like "candles"), categories (array of Faire category names/slugs like "home-decor", "jewelry"), startUrls (array of any Faire brand/product/category/search URLs, auto-detected), brandUrls/brandTokens (array of brand URLs or b_... tokens to enrich directly, no discovery needed), productUrls (array of product URLs or p_... tokens to scrape as product records), scrapeAllBrands (boolean, discovers brands at scale from Faire's public sitemaps), brandValues (array from women-owned/eco-friendly/hand-made/organic/gives-back/small-batch/not-sold-on-amazon), country, state, minProducts, keyword, maxResults (default 20, 0 = unlimited), and monitorMode (boolean, only output brands that are new or changed since the last run). Output is one JSON object per brand lead (type: "brand") with brandToken, name, description, brandUrl, city/state/shipsFromCountry, ownerFirstName, creationYear, instagramHandle/instagramFollowers, activeProductsCount, minimumOrderUsd/firstOrderMinimumUsd/reorderMinimumUsd, leadTimeDays, brandValues, averageRating/numReviews plus a quality/fulfillment/communication breakdown, badges, videos, and a computed 0-100 leadScore — or per product (type: "product") with productToken, name, description, category, variants (SKU, GTIN, retail price, case-pack size), retailPriceMinUsd/MaxUsd, images, and the parent brand's minimum order and lead time. Full API reference: https://apify.com/parsebird/faire-scraper/api. Get an API token at https://console.apify.com/account/integrations.
```

### What does Faire Scraper do?

Faire Scraper turns [Faire.com](https://www.faire.com/)'s wholesale marketplace into structured, ready-to-use data. It supports six ways to find brands, which can be combined in a single run:

- 🔍 **Keyword search** — browse products matching a term (e.g. "ceramic mugs") and collect the brands behind them
- 🏷️ **Category browse** — walk a Faire category (home decor, jewelry, kitchen & dining, and 140+ more) page by page
- 🔗 **Any Faire URL** — paste brand pages, product pages, category pages, or search-result pages; the type is auto-detected
- 🎯 **Direct brand tokens/URLs** — enrich a known list of brands straight away, no discovery needed
- 📦 **Direct product tokens/URLs** — pull full pricing and variant data for specific products
- 🌐 **Sitemap-wide discovery** — pull brands at scale from Faire's own public sitemaps, then apply filters

Every discovered brand can be filtered by **brand values** (women-owned, eco-friendly, hand-made, organic, gives-back, small-batch, not sold on Amazon), **country**, **state**, **minimum active products**, and a free-text **keyword**. Filters apply after discovery, so they work the same way no matter which discovery method found the brand.

Each brand lead also gets a computed **0-100 lead score** — our own transparent scoring formula that blends review rating, review volume, catalog depth, "new products" and "top shop" status, and order accessibility — to help you triage which suppliers are worth reaching out to first.

Runs can be triggered on a **schedule**, called via the **Apify API**, or wired into **Zapier, Make, or n8n** integrations, so you can monitor a category for new or changed suppliers over time using **Monitor mode**. Results export as **JSON, CSV, or Excel**.

### What data can you extract from Faire?

**Brand (supplier lead) records:**

| Field | Description |
|-------|-------------|
| `name`, `description`, `brandUrl` | Brand identity and public profile link |
| `city`, `state`, `shipsFromCountry`, `madeIn` | Location and manufacturing origin |
| `ownerFirstName`, `creationYear` | Founder and founding year |
| `instagramHandle`, `instagramFollowers` | Social reach |
| `activeProductsCount`, `hasNewProducts`, `isTopShop` | Catalog size and status signals |
| `minimumOrderUsd`, `firstOrderMinimumUsd`, `reorderMinimumUsd` | Order minimums |
| `leadTimeDays`, `shippingDaysMin`/`Max`, `estimatedShipDate` | Fulfillment speed |
| `brandValues`, `womenOwned` | Women-owned, eco-friendly, hand-made, and other Faire values |
| `averageRating`, `numReviews`, `ratingProductQuality`/`Fulfillment`/`Communication` | Review breakdown |
| `badges`, `videos`, `videoCount` | Press/media badges and brand videos |
| `leadScore` | ParseBird's own 0-100 computed lead score (see [FAQ](#faq)) |

**Product records** (from `productUrls`): `name`, `description`, `category`, `variants` (SKU, GTIN, retail price, case-pack size, measurements), `retailPriceMinUsd`/`MaxUsd`, `images`, `badges`, plus the parent brand's minimum order, lead time, and location.

See [Output example](#output-example) below for a full record.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| searchQueries | array | No\* | `[]` | Keywords to browse, e.g. `"candles"` |
| categories | array | No\* | `["home-decor"]` | Faire category names or slugs |
| startUrls | array | No\* | `[]` | Any Faire brand/product/category/search URLs |
| brandUrls | array | No\* | `[]` | Brand URLs or `b_...` tokens to enrich directly |
| productUrls | array | No\* | `[]` | Product URLs or `p_...` tokens to scrape |
| scrapeAllBrands | boolean | No\* | `false` | Discover brands from Faire's public sitemaps |
| brandValues | array | No | `[]` | Keep only brands with these values |
| country | string | No | — | Keep only brands shipping from this country |
| state | string | No | — | Keep only brands based in this state/region |
| minProducts | integer | No | `0` | Minimum active products on Faire |
| keyword | string | No | — | Match a word in the brand name/description |
| maxResults | integer | No | `20` | Cap on brand records. `0` = unlimited (use with a run timeout) |
| monitorMode | boolean | No | `false` | Only output brands new or changed since the last run |

\* At least one of `searchQueries`, `categories`, `startUrls`, `brandUrls`, `productUrls`, or `scrapeAllBrands` is required.

### Output example

```json
{
  "type": "brand",
  "brandToken": "b_8ed70fdd",
  "name": "Rifle Paper Co.",
  "brandUrl": "https://www.faire.com/brand/b_8ed70fdd",
  "city": "Winter Park",
  "state": "FL",
  "shipsFromCountry": "United States",
  "ownerFirstName": "Shalyn",
  "creationYear": 2009,
  "instagramHandle": "riflepaperco",
  "instagramFollowers": 1026274,
  "activeProductsCount": 1308,
  "hasNewProducts": true,
  "isTopShop": true,
  "minimumOrderUsd": 500.0,
  "firstOrderMinimumUsd": 500.0,
  "reorderMinimumUsd": 150.0,
  "leadTimeDays": 4,
  "brandValues": [],
  "averageRating": 4.8,
  "numReviews": 180,
  "ratingProductQuality": 4.9,
  "ratingFulfillment": 5.0,
  "ratingCommunication": 4.9,
  "leadScore": 92,
  "scrapedAt": "2026-09-19T04:00:00Z"
}
```

Download results as **JSON, CSV, or Excel** from the Apify Console, or pull them programmatically via the [dataset API](https://docs.apify.com/api/v2#/reference/datasets).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/faire-scraper").call(run_input={
    "categories": ["home-decor", "jewelry"],
    "brandValues": ["women-owned"],
    "country": "United States",
    "minProducts": 10,
    "maxResults": 200,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item.get("leadScore"), item.get("minimumOrderUsd"))
```

#### JavaScript

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "<YOUR_API_TOKEN>" });
const run = await client.actor("parsebird/faire-scraper").call({
    categories: ["home-decor", "jewelry"],
    brandValues: ["women-owned"],
    country: "United States",
    minProducts: 10,
    maxResults: 200,
});

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

### Use cases

- 🤝 Build a **supplier prospecting list** for a new retail category, filtered by values that match your store's brand
- 📈 Monitor a category with **Monitor mode** on a schedule to catch new or changed suppliers first
- 🛍️ Pull **product-level pricing and SKUs** for a curated list of items before placing a wholesale order
- 🧭 Research **competitor brands** — catalog size, minimums, lead time, and review scores at a glance
- 📊 Feed a CRM or BI dashboard with structured supplier data via the Apify API

### How it works

1. Faire Scraper resolves your `categories`, `searchQueries`, and `startUrls` into candidate brands using Faire's own category-browse and product-search endpoints.
2. `brandUrls`/`brandTokens` and `scrapeAllBrands` (via Faire's public sitemaps) add brands directly, without needing to pass Faire's Cloudflare check at all.
3. Every candidate brand is enriched with its full public profile — description, minimums, lead time, reviews, and values — and your filters (brand values, country, state, minimum products, keyword) are applied.
4. `productUrls` entries are fetched as full product pages and parsed for pricing, variants, SKUs, and GTINs.
5. With `monitorMode` on, each brand's catalog size and minimum order are compared against the previous run, and only new-or-changed brands are pushed.
6. Every record is pushed to the dataset as soon as it's built, and billed via [pay-per-result](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) — you never pay for empty runs.

### How much does it cost to scrape Faire?

Faire Scraper uses **pay-per-result** pricing — you only pay for records actually returned, never for compute time or failed runs.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `supplier-lead` (per brand) | $3.99 / 1,000 | $3.49 / 1,000 | $2.99 / 1,000 | $2.49 / 1,000 |
| `product` (per product) | $1.99 / 1,000 | $1.49 / 1,000 | $1.29 / 1,000 | $1.09 / 1,000 |

Scraping 1,000 brand leads on a Gold plan costs about **$2.49**. Apify's [monthly platform usage credits](https://apify.com/pricing) apply on top of your plan, so most light usage is covered without any extra charge.

### Input & output

The input schema groups fields into **Discovery**, **Filters**, **Run settings**, and **Advanced** — open the [Input tab](https://apify.com/parsebird/faire-scraper/input-schema) to see every field with examples. Every run's results are available as a dataset — export as JSON, CSV, or Excel, or read them with the [Apify API](https://docs.apify.com/api/v2) and [client libraries](https://docs.apify.com/api/client/python/) for Python and JavaScript.

### Is it legal to scrape Faire?

Scraping publicly available data — the kind shown on Faire's public brand and product pages without logging in — is generally considered legal, including under rulings like *hiQ Labs v. LinkedIn*. That said, you're responsible for how you use the data: don't scrape personal data outside these fields, respect [Faire's Terms of Service](https://www.faire.com/), and consult a lawyer if you plan to redistribute the data commercially. Read more in Apify's [guide to web scraping and the law](https://blog.apify.com/is-web-scraping-legal/).

### Related Actors

Looking for other supplier or marketplace data sources? Check out [ParseBird's Apify Store profile](https://apify.com/parsebird) for more scrapers covering ecommerce, real estate, and marketplace data.

### FAQ

**Does this need a Faire account or API key?**
No. Faire Scraper reads Faire's own public brand and product pages — no login or key required.

**What is the "lead score"?**
It's ParseBird's own 0-100 heuristic, not a number Faire publishes. It combines average rating (35%), review volume (20%), catalog depth (20%), "new products" status (10%), "top shop" status (10%), and a low order minimum (5%) into one comparable score, so you can quickly rank suppliers worth contacting first.

**Can I combine categories, search queries, and direct brand tokens in one run?**
Yes. All discovery methods feed the same de-duplicated brand list, and every filter (brand values, country, state, minimum products, keyword) applies across all of them together.

**Why don't some brands have a `website` field?**
Faire doesn't expose a structured website field on brand profiles. When a brand's own description text ends with a bare domain (a common pattern), it's extracted as a best-effort `website` value; otherwise the field is `null` rather than a guess.

**What does `scrapeAllBrands` return?**
It walks Faire's own public brand sitemaps, which list well over 100,000 brand URLs. Always set `maxResults` and a run timeout when using it.

**Can I run this on a schedule to catch new suppliers?**
Yes — use [Apify's Scheduler](https://docs.apify.com/platform/schedules) together with `monitorMode: true` to run daily or weekly and only get brands that are new or whose catalog size / minimum order changed.

**Something looks wrong or missing — where do I report it?**
Open an issue on the Actor's Issues tab in Apify Console, or reach out via [Apify's support](https://apify.com/contact). Feedback on data accuracy is always welcome.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/faire-scraper/changelog.md

# Actor input Schema

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

Keywords to browse on Faire, e.g. candles, ceramic mugs. Each query collects the brands behind the matching products.

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

Faire category names or slugs (home-decor, jewelry, kitchen-and-dining, beauty-and-wellness, food-and-drink, pets, ...), or a full category path pasted from a Faire URL.

## `startUrls` (type: `array`):

Any Faire URLs: brand pages (/brand/...), product pages (/product/...), category or search pages. The type is auto-detected from the URL.

## `brandUrls` (type: `array`):

Enrich specific brands directly. Accepts full brand URLs, or brand tokens (b\_...), one per line.

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

Scrape specific Faire products as product records. Accepts full product URLs (/product/...), or product tokens (p\_...), one per line.

## `scrapeAllBrands` (type: `boolean`):

Discover brands at scale from Faire's public brand sitemaps, then apply the filters below. Can return well over 100,000 brands — always set Max results and use a run timeout.

## `brandValues` (type: `array`):

Keep only brands that carry these values on their Faire profile.

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

Keep only brands shipping from this country, e.g. United States.

## `state` (type: `string`):

Keep only brands based in this state or region, e.g. CA.

## `minProducts` (type: `integer`):

Keep only brands with at least this many active products on Faire.

## `keyword` (type: `string`):

Keep only brands whose name or description contains this word.

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

Cap on brand (and product) records returned. Set to 0 for no limit — only do this together with a run timeout, since Faire has 100,000+ brands.

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

Output only brands that are new, or whose product count or minimum order changed, since the last run. Pair this with an Apify Schedule for ongoing monitoring.

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

Faire is protected by Cloudflare. Residential proxies are strongly recommended.

## Actor input object example

```json
{
  "searchQueries": [],
  "categories": [
    "home-decor"
  ],
  "startUrls": [],
  "brandUrls": [],
  "productUrls": [],
  "scrapeAllBrands": false,
  "brandValues": [],
  "minProducts": 0,
  "maxResults": 20,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchQueries": [],
    "categories": [
        "home-decor"
    ],
    "startUrls": [],
    "brandUrls": [],
    "productUrls": [],
    "brandValues": [],
    "country": "",
    "state": "",
    "minProducts": 0,
    "keyword": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/faire-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 = {
    "searchQueries": [],
    "categories": ["home-decor"],
    "startUrls": [],
    "brandUrls": [],
    "productUrls": [],
    "brandValues": [],
    "country": "",
    "state": "",
    "minProducts": 0,
    "keyword": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/faire-scraper").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 '{
  "searchQueries": [],
  "categories": [
    "home-decor"
  ],
  "startUrls": [],
  "brandUrls": [],
  "productUrls": [],
  "brandValues": [],
  "country": "",
  "state": "",
  "minProducts": 0,
  "keyword": "",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parsebird/faire-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/faire-scraper"
        }
    }
}
```

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/ssFLVoPVXNluHh0dW/builds/CbRMkddFGOlTjky9O/openapi.json
