# Thrive Market Scraper - Grocery Price, Stock & Rank Data (`growth-installations/thrive-market-scraper`) Actor

Thrive Market scraper and grocery price API. Extract member vs compare-at price, autoship price, bestseller rank, per-warehouse stock, ratings, reviews, diet and certification claims, nutrition and promos. 74 data fields per product plus a daily price and stock change feed.

- **URL**: https://apify.com/growth-installations/thrive-market-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.50 / 1,000 product scrapeds

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

Turn [Thrive Market](https://thrivemarket.com/) into a structured grocery data feed. One run returns every product with member price vs. compare-at price, bestseller rank, per-warehouse stock, ratings, reviews, diet and certification claims, nutrition and the promo campaigns each item is sitting in — **74 fields per SKU**. Run it again tomorrow and it tells you exactly what moved.

No browser is launched, no login is used, and no disallowed URL is ever requested. See [Is it legal to scrape Thrive Market?](#is-it-legal-to-scrape-thrive-market) below.

### What this Thrive Market scraper extracts

| Group | Fields |
| --- | --- |
| Identity | `sku`, `gtin13`, `productId`, `title`, `brand`, `manufacturer`, `url`, `slug`, `images`, `description` |
| Grocery pricing | `price` (member), `compareAtPrice`, `autoshipPrice`, `discountPercent`, `discountAmount`, `unitPriceText`, `unitSize`, promo windows, temporary price reductions |
| Demand signals | `salesRank`, `ratingsRank`, `ratingAverage`, `ratingCount`, `reviewCount`, `reviewScore` |
| Stock availability | `inStock`, `totalInventoryUnits`, `inventoryByWarehouse` (11 warehouses), `qtyAvailable` |
| Product claims | `dietTags`, `healthIngredientTags`, `certificationTags`, `environmentSocialTags`, `thriveExclusive`, `badges` |
| Merchandising | `categories`, `visibleCategoryLabel`, `activeCampaigns`, `conversionDrivers`, `similarProducts` |
| Compliance | `prop65Warning`, `ageRestricted`, `ebtEligible`, `restrictionTag` |
| Content | `nutrition` (per-serving rows, calories, servings), `ingredients`, `descriptionHtml`, meta fields |
| Change feed | `changes` — see [price monitoring](#how-to-monitor-thrive-market-price-changes-daily) |

Set `includeRawProduct: true` to also get the untouched upstream payload.

### Grocery price, stock and bestseller data a generic scraper cannot give you

| | Generic HTML scraper | This grocery price scraper |
| --- | --- | --- |
| Fields per product | title, price, image | **74 normalised fields** |
| Demand signal | none | `salesRank`, `ratingsRank`, review-count growth |
| Stock availability | in stock / out of stock | unit counts across **11 warehouses** |
| Promotions | maybe a strikethrough price | live campaign names and promo windows |
| Repeat runs | full dump every time | **change feed** — only what moved |
| Engine | a headless browser per page | plain HTTP with [Cheerio](https://cheerio.js.org/) |

Thrive Market renders its product data server-side, so this Actor parses it straight out of the HTML instead of driving a browser. That is why a full catalog sweep is cheap enough to schedule daily.

#### What can you do with Thrive Market product data?

- **Price and promo intelligence** — track member, autoship and compare-at prices across the catalog and see which SKUs enter or leave a sale.
- **Trend and demand detection** — `salesRank` plus review-count growth is the closest public proxy to units sold, so rank movement surfaces a product taking off early.
- **Assortment and white-space analysis** — 22 claim tags per product (keto, paleo, gluten-free, Fair Trade, B Corp, plastic-neutral) let you size a niche and find under-served categories.
- **Stock and supply monitoring** — per-warehouse unit counts expose regional stockouts and restocks before the site says sold out.
- **Competitive benchmarking** — join to your own catalog on GTIN-13 / UPC and compare price, claims and rank SKU by SKU.
- **AI and agent pipelines** — clean JSON with published input and output schemas, so an agent or MCP client can call it as a tool.

### How to scrape Thrive Market product data, step by step

1. Click **Try for free** on this page. The default input scrapes 10 products, which finishes in well under a minute.
2. Open the **Input** tab. Leave **What to scrape** on *Full catalog* to sweep the whole site, or switch it to *Specific product URLs* and paste a watchlist.
3. Optionally type keywords into **Search terms** — for example `olive oil` — to narrow a catalog run to matching products.
4. Set **Max products** to `0` when you want the entire catalog rather than a sample.
5. Under **Change detection**, switch on **Track changes** so every run records price, rank, stock and review deltas against the previous one.
6. Press **Start**. Results appear in the **Output** tab, pre-arranged into five views: Overview, Pricing & promotions, Demand & ranking signals, Claims & attributes, and Changes since last run.
7. Export to JSON, CSV or Excel, or send the data onward from the **Integrations** tab. See the [Apify integrations docs](https://docs.apify.com/platform/integrations).
8. Open the **Schedules** tab and add a daily run to turn the Actor into a standing price monitor.

#### How do I scrape Thrive Market prices into Google Sheets?

Run the Actor, then add the Google Sheets integration from the **Integrations** tab and pick the dataset. Every scheduled run appends to the same sheet. Slack, Airtable, Amazon S3, a plain webhook, Make and Zapier all work the same way.

#### Can I call this as a Thrive Market API?

Yes. Every Apify Actor exposes a REST API. The **API** button on this page generates ready-made cURL, Python and JavaScript snippets that start a run and fetch the dataset, so you can treat the Actor as a Thrive Market product API without hosting anything.

### Example input

Watch a small list of products — the cheapest and fastest way to test:

```json
{
  "crawlMode": "productUrls",
  "productUrls": [
    "https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches"
  ],
  "trackChanges": true
}
```

Sweep one niche and keep only discounted items:

```json
{
  "crawlMode": "fullCatalog",
  "searchTerms": ["olive oil", "avocado oil"],
  "onlyDiscounted": true,
  "maxItems": 200
}
```

A daily change feed for the whole catalog:

```json
{
  "crawlMode": "fullCatalog",
  "maxItems": 0,
  "onlyChanged": true,
  "snapshotStoreName": "thrive-market-snapshots"
}
```

### Example output

```json
{
  "sku": "671635705471",
  "gtin13": "671635705471",
  "title": "Organic Apple Sauce Pouches",
  "brand": "Thrive Market",
  "url": "https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches",
  "price": 11.49,
  "compareAtPrice": 16.89,
  "autoshipPrice": 10.92,
  "discountPercent": 31.97,
  "unitPriceText": "$0.96/pouch",
  "inStock": true,
  "totalInventoryUnits": 27696,
  "inventoryByWarehouse": { "wh_1": 4120, "wh_5": 9033 },
  "salesRank": 2,
  "ratingsRank": 17,
  "ratingAverage": 4.64,
  "ratingCount": 7014,
  "dietTags": ["Gluten-Free", "Vegan", "Paleo"],
  "certificationTags": ["USDA Organic", "Non-GMO Project Verified"],
  "activeCampaigns": ["Snack Sale"],
  "categories": ["Snacks", "Fruit Snacks"],
  "changes": {
    "isNewSinceLastRun": false,
    "previousPrice": 11.99,
    "priceDelta": -0.5,
    "salesRankDelta": 3,
    "inventoryDelta": -812,
    "ratingCountDelta": 14
  }
}
```

### How much does it cost to scrape Thrive Market?

You pay per product delivered, not per compute second, and platform usage is included. The unit price drops with your Apify subscription tier:

| Your Apify plan | Per product | Per 1,000 products |
| --- | --- | --- |
| Free | $0.0040 | $4.00 |
| Starter | $0.0035 | $3.50 |
| Scale | $0.0030 | $3.00 |
| Business | $0.0025 | $2.50 |

A 10-product test run costs about four cents. The whole Thrive Market catalogue, roughly 8,500 products, comes to about $34 on Free and about $21 on Business. Products that your own filters reject, or pages that are blocked or skipped, are never charged for. Two token amounts also apply and are negligible in practice: $0.01 per 1,000 dataset items and $0.00005 per run start.

#### How can I keep the cost down on a daily schedule?

Switch on **Only output products that changed**. Day one returns the full set; after that you only receive the SKUs whose price, rank, stock or review count actually moved. A product that gets checked and turns out to be unchanged bills at a quarter of the normal rate, $0.0010 per product on Free down to $0.0007 on Business, so a daily sweep of the catalogue where nothing much moved costs single-digit dollars rather than tens. Narrowing with **Search terms** or a **product URL** watchlist is cheaper still.

### How to monitor Thrive Market price changes daily

Set `trackChanges: true` (or `onlyChanged: true`) and the Actor keeps a compact baseline in a named key-value store — one JSON blob keyed by SKU, so it costs two storage calls per run rather than two per product. Every record then carries `previousPrice`, `priceDelta`, `salesRankDelta`, `inventoryDelta`, `ratingCountDelta`, `previousCapturedAt` and `isNewSinceLastRun`.

Use a different `snapshotStoreName` for each watchlist to keep timelines separate, then add a [schedule](https://docs.apify.com/platform/schedules) so the feed builds itself.

### Reliability and blocking

Thrive Market sits behind AWS WAF and returns sporadic 403s. The Actor handles that for you with block-aware retries, session rotation on a low error tolerance, a fresh IP per retry, and a `scrapeStatus: "failed"` row for any URL it still cannot fetch — so a partial run is never a silent one. It is built on [Crawlee](https://crawlee.dev/).

#### Why am I getting 403 errors or empty results?

Almost always the proxy. Leave **Proxy configuration** on Apify Proxy, and choose residential proxies for full-catalog sweeps; datacenter proxies are fine for small watchlists. If the sitemap itself is blocked the run fails loudly with a clear message rather than returning nothing.

### Is it legal to scrape Thrive Market?

This Actor only reads public product pages, discovered from the public `sitemap.xml` — the same pages Thrive Market explicitly permits AI crawlers to fetch in its `robots.txt`.

It never requests the paths Thrive Market disallows (`/api/`, `/catalogsearch/`, `/account/`, `/checkout/`, `/customer/`, `/review/`, `/auth/`), never uses sorted or filtered URLs, and never logs in, so no member-only or account data is involved. For strict adherence to the published crawl-delay of 5 seconds, set `sameDomainDelaySecs: 5` and `maxConcurrency: 1`.

**Reviewer privacy.** Review text, rating, verified-buyer flag and timestamp are returned. Reviewer names, customer IDs and locations are discarded and never written to the dataset.

You are responsible for how you use the output. Check Thrive Market's terms and your own legal position before commercial use, and see Apify's guide to [ethical web scraping](https://blog.apify.com/is-web-scraping-legal/).

### FAQ

#### How many products does Thrive Market have?

About 8,500 product pages, rediscovered fresh from the sitemap on every run. The count drifts by a few dozen week to week, which is itself a useful assortment signal.

#### Can I scrape Thrive Market prices without an account?

Yes. Member prices, compare-at prices and autoship prices are all rendered on the public product page, so no login is required and none is used.

#### Can I get Thrive Market bestsellers?

Sort the dataset by `salesRank`, or filter a run with **Max sales rank** to keep only top-ranked products. Combine with `onlyChanged` to watch rank movement over time.

#### Can I scrape Thrive Market reviews?

Set `includeReviews: true`. Reviews come back anonymised: rating, title, body, verified-buyer flag, helpful count and date, with no reviewer identity.

#### Can I filter by diet, certification or brand?

Yes — `dietValues`, `brandUrlKeys`, `categoryUrlKeys`, `onlyDiscounted`, `onlyInStock`, `onlyThriveExclusive`, `minRating`, `minReviewCount` and `maxSalesRank` all narrow the output. Filters are applied after a page is fetched, so a filtered catalog run still visits the catalog.

#### How long does a full catalog sweep take?

Roughly 45 seconds per 12 products at default concurrency. A full sweep on residential proxies typically finishes well inside an hour.

#### Something broke — how do I get help?

Open the **Issues** tab on this page with your run ID. Site layout changes get fixed quickly.

### Related scrapers

Looking for other retailers or a broader sweep? Try the [E-commerce Scraping Tool](https://apify.com/apify/e-commerce-scraping-tool) for arbitrary retail sites, the [Website Content Crawler](https://apify.com/apify/website-content-crawler) to feed pages into an LLM or RAG pipeline, or browse the [E-commerce category](https://apify.com/store/categories/ecommerce) in Apify Store.

# Actor input Schema

## `crawlMode` (type: `string`):

Full catalog enumerates every product from thrivemarket.com/sitemap.xml (~8,500 products) and applies your filters. Specific product URLs is for targeted price/stock monitoring of a known watchlist.

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

Thrive Market product detail page URLs, e.g. https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches. Used when crawl mode is 'Specific product URLs only'.

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

Narrow a full-catalog run to products whose name matches any of these keywords, e.g. "olive oil", "collagen". Matching is done on the sitemap slug, so no disallowed search URLs are requested. Leave empty to scrape everything.

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

Stop after this many products have been saved. Set to 0 for no limit (the full Thrive Market catalog is roughly 8,500 products). The default of 10 keeps your first run fast and cheap.

## `categoryUrlKeys` (type: `array`):

Keep only products belonging to these category slugs, e.g. healthy-snacks, coffee, vitamins-supplements, bestsellers, trending. Matches any category the product is filed under. Leave empty for all categories.

## `brandUrlKeys` (type: `array`):

Keep only these brand slugs, e.g. thrive-market, simple-mills, primal-kitchen. Leave empty for all brands.

## `dietValues` (type: `array`):

Keep only products carrying ALL of these claim labels, e.g. Organic, Gluten-Free, Vegan, Keto, Paleo, Non-GMO, Certified Kosher. Leave empty to ignore.

## `onlyDiscounted` (type: `boolean`):

Keep only products where the member price is below the compare-at price.

## `onlyInStock` (type: `boolean`):

Keep only products that are currently purchasable in at least one fulfilment centre.

## `onlyThriveExclusive` (type: `boolean`):

Keep only Thrive Market's own-brand / exclusive products.

## `minRating` (type: `integer`):

Keep only products rated at or above this value (0-5). Use 0 to ignore.

## `minReviewCount` (type: `integer`):

Keep only products with at least this many ratings. Useful as a demand / popularity floor.

## `maxSalesRank` (type: `integer`):

Keep only products whose bestseller rank is at or below this number, i.e. the top sellers. Use 0 to ignore.

## `includeNutrition` (type: `boolean`):

Include the full nutrition panel (serving size, calories, per-nutrient amounts and % daily values).

## `includeIngredients` (type: `boolean`):

Include the declared ingredient list for each product.

## `includeWarehouseInventory` (type: `boolean`):

Include unit quantities per fulfilment centre, which reveals regional depth and stock-out risk.

## `includeReviews` (type: `boolean`):

Include the handful of reviews rendered on the product page. Reviewer names, customer IDs and locations are always stripped.

## `includeSimilarProducts` (type: `boolean`):

Include the products Thrive Market itself cross-links as alternatives, with their price and rank.

## `includeRawProduct` (type: `boolean`):

Attach the site's complete underlying product object. Large, but future-proof if you want fields this Actor does not map yet.

## `trackChanges` (type: `boolean`):

Persist a snapshot per SKU and enrich every record with price moves, rank moves, stock flips, rating growth and new-product detection. This is what turns the Actor into a monitoring feed.

## `onlyChanged` (type: `boolean`):

Return just the SKUs whose price, bestseller rank, inventory or review count moved since the previous run, plus brand-new SKUs. Turns a full sweep into a compact change feed and keeps pay-per-result costs down. Implies change tracking.

## `snapshotStoreName` (type: `string`):

Named key-value store holding the baseline. Use one store per watchlist so schedules do not overwrite each other.

## `maxConcurrency` (type: `integer`):

Parallel requests. Thrive Market's robots.txt suggests a 5 second crawl delay for agents, so keep this modest and pair it with the delay below for polite crawling.

## `sameDomainDelaySecs` (type: `integer`):

Seconds to wait between consecutive requests to thrivemarket.com. Set to 5 to follow the crawl-delay published in robots.txt.

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

Thrive Market sits behind a WAF. Residential or datacenter Apify Proxy is strongly recommended.

## Actor input object example

```json
{
  "crawlMode": "fullCatalog",
  "productUrls": [
    {
      "url": "https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches"
    }
  ],
  "searchTerms": [],
  "maxItems": 10,
  "categoryUrlKeys": [],
  "brandUrlKeys": [],
  "dietValues": [],
  "onlyDiscounted": false,
  "onlyInStock": false,
  "onlyThriveExclusive": false,
  "minRating": 0,
  "minReviewCount": 0,
  "maxSalesRank": 0,
  "includeNutrition": true,
  "includeIngredients": true,
  "includeWarehouseInventory": true,
  "includeReviews": false,
  "includeSimilarProducts": false,
  "includeRawProduct": false,
  "trackChanges": false,
  "onlyChanged": false,
  "snapshotStoreName": "thrive-market-snapshots",
  "maxConcurrency": 5,
  "sameDomainDelaySecs": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `overview` (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 = {
    "productUrls": [
        {
            "url": "https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches"
        }
    ],
    "searchTerms": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("growth-installations/thrive-market-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 = {
    "productUrls": [{ "url": "https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches" }],
    "searchTerms": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("growth-installations/thrive-market-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 '{
  "productUrls": [
    {
      "url": "https://thrivemarket.com/p/thrive-market-organic-apple-sauce-pouches"
    }
  ],
  "searchTerms": [],
  "maxItems": 10
}' |
apify call growth-installations/thrive-market-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2rF2ZP2TtJMVf4sqh/builds/YGKmEye88DNIya9qO/openapi.json
