# Bed Bath & Beyond Price & Rewards Scraper (`dataspryva/bed-bath-and-beyond-price-and-rewards-scraper`) Actor

Search bedbathandbeyond.com by keyword or home-goods department and get price, sale price, brand, rating, review count, images, two-day-shipping eligibility and Welcome Rewards cash-back data. No login or proxy required.

- **URL**: https://apify.com/dataspryva/bed-bath-and-beyond-price-and-rewards-scraper.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

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

## Bed Bath & Beyond Price & Rewards Scraper

Collect live product data from the current [bedbathandbeyond.com](https://www.bedbathandbeyond.com) catalog. Search by keyword, browse a home-goods department, look up specific products, or pull full customer reviews — with prices, sale prices, ratings, review text, images, shipping flags and Welcome Rewards cash-back figures.

### What this actor does

- **Search products** by free-text keyword across the live catalog
- **Browse 17 home-goods departments** — bedding, bath, kitchen, furniture, decor, mattresses and more
- **Look up products** from product-page URLs or numeric product IDs
- **Collect customer reviews** with review text, star rating, author, date, verified-purchase flag and customer photos
- Filter products by price range, average rating, on-sale status, two-day shipping and brand/title text
- Filter reviews by star rating, verified buyers and reviews with photos
- Return only fields that have a real value — nothing is emitted as a placeholder

### Output

Every record carries `recordType` (`product` or `review`) and `scrapedAt` (UTC ISO timestamp).

#### Product records

- `productId`, `sku` — catalog identifiers
- `title`, `brand`, `productUrl`, `sourceUrl`
- `price`, `priceMax`, `currency` — current price; `priceMax` is set when size/color options have different prices
- `originalPrice`, `discountPercent`, `onSale`, `saleEndDate`
- `rating`, `reviewCount`, `ratingCount`, `ratingHistogram`, `recommendedRatio`
- `description`, `shortDescription`, `countryOfOrigin`, `firstListed`, `inStock`, `freeShipping`
- `imageUrl`, `fullImageUrl`, `breadcrumbs`, `specifications`, `optionCount`
- `urgencyMessaging`, `valueMessaging`, `twoDayShipping`, `isSponsored`
- `rewardsAmount`, `rewardsPoints`, `rewardsPercentage`
- `category` (department mode) or `searchKeywords` (keyword search)

Product-detail fields beyond the search card (`description`, `specifications`, etc.) are populated when the site's product API is reachable; otherwise the actor falls back to the search card plus the review rollup.

#### Review records

- `reviewId`, `legacyReviewId`, `productId`, `productName`, `productUrl`
- `title`, `text`, `rating`, `author`, `location`
- `createdDate`, `updatedDate`
- `verifiedBuyer`, `verifiedReviewer`, `staffReviewer`
- `helpfulVotes`, `notHelpfulVotes`, `helpfulScore`
- `variantId`, `upc`, `gtin`, `locale`, `images`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search`, `byCategory`, `product` or `reviews` |
| `keywords` | string | — | Free-text query for `search`, e.g. `towel`, `comforter set` |
| `category` | string | `Bedding` | Department for `byCategory` (17 options) |
| `productUrls` | array | — | Product-page URLs or numeric IDs for `product` / `reviews` |
| `sortBy` | string | `relevance` | Product sort: `relevance`, `onSale`, `bestSelling`, `priceLowHigh`, `priceHighLow`, `rating`, `newArrivals` |
| `minPrice` | integer | — | Drop products below this price (server-side filter) |
| `maxPrice` | integer | — | Drop products above this price (server-side filter) |
| `minRating` | integer | — | Minimum product rating, or minimum review star rating |
| `maxRating` | integer | — | Maximum product rating, or maximum review star rating |
| `onSaleOnly` | boolean | `false` | Only on-sale products |
| `fastShippingOnly` | boolean | `false` | Only two-day-shipping products |
| `brandContains` | string | — | Keep products whose brand or title contains this text |
| `maxItems` | integer | `30` | Max product records for search/department/product modes |
| `reviewSort` | string | `newest` | `newest`, `oldest`, `highestRating`, `lowestRating`, `mostHelpful` |
| `maxReviews` | integer | `50` | Max review records across all product references |
| `verifiedOnly` | boolean | `false` | Only verified-purchase reviews |
| `withImagesOnly` | boolean | `false` | Only reviews that include customer photos |

#### Examples

Keyword search:

```json
{
  "mode": "search",
  "keywords": "comforter set",
  "maxItems": 30
}
```

Browse a department, on sale and highly rated:

```json
{
  "mode": "byCategory",
  "category": "Bath",
  "onSaleOnly": true,
  "minRating": 4,
  "maxItems": 40
}
```

Product lookups from URLs or IDs:

```json
{
  "mode": "product",
  "productUrls": [
    "https://www.bedbathandbeyond.com/Bedding-Bath/Superior-Egyptian-Cotton-900-GSM-Luxurious-Absorbent-6-piece-Towel-Set/5296998/product.html",
    "44226118"
  ]
}
```

Recent five-star reviews with photos:

```json
{
  "mode": "reviews",
  "productUrls": ["5296998"],
  "reviewSort": "newest",
  "minRating": 5,
  "withImagesOnly": true,
  "maxReviews": 50
}
```

### Use cases

- **Price monitoring** — track catalog prices, sale prices and discount percentages over time
- **Assortment research** — see what is on sale, best-selling or newly listed in a department
- **Competitive analysis** — compare home-goods pricing and ratings across retailers
- **Voice-of-customer analysis** — collect review text and star ratings for sentiment and topic research
- **Affiliate and content sites** — source product data, images and ratings for buying guides
- **Deal aggregation** — surface highly rated, on-sale products across departments

### Data source & limitations

- **Catalog search** — the site's server-rendered `/search` page embeds a Next.js `__NEXT_DATA__` payload with product cards, price, sale, rating, review count, images, shipping and rewards fields. No login or cookies are needed.
- **Price filter** — `minPrice` / `maxPrice` are sent to the catalog as its own `price=<min>:<max>` filter, so the fetched window is already price-filtered.
- **Other product filters** — the server ignores rating, brand and promotion query parameters, so `minRating`, `maxRating`, `onSaleOnly`, `fastShippingOnly` and `brandContains` are applied to the fetched records.
- **Sorting** — the site's sort links are client-side only and are ignored by a plain HTTP request, so product sorting is applied to the fetched result window. For a true lowest/highest price across a large department, raise `maxItems` and pair it with a price sort.
- **Direct department pages** — the site's `/c/...` department pages are bot-protected. Department mode reaches each department through the catalog's own search relevance for the department name; the department is recorded in `category`.
- **Product details** — product-page HTML and `/api/product.json` are bot-protected from most network exits. The actor tries the product API first, then falls back to the search card, the product URL exposed by the search redirect, and the review rollup. Core price/rating/review-count data is therefore always available for a valid product ID or URL.
- **Reviews** — full review text comes from the site's public PowerReviews display endpoint. Reviews are paginated 25 at a time; `maxReviews` caps the run.
- **Currency** — USD only (US storefront).
- **Images** — CDN image URLs are unsigned and do not expire.
- **No affiliation** — this is an independent third-party actor, not affiliated with or endorsed by Bed Bath & Beyond or its operating company.

### FAQ

**Do I need a proxy or login?**
No. The actor works with no account, cookies or proxy setup.

**Will my old saved task keep working?**
Yes. Legacy input keys are mapped in code: `query`, `searchQuery` and `q` become `keywords`; `department` and `categoryName` become `category`; `productId`, `productUrl`, `urls` and `startUrls` become `productUrls`; snake_case variants such as `max_items` and `min_price` are also accepted. Old tasks do not need to be edited.

**Why is `brand` sometimes missing?**
Search cards do not carry an explicit brand field. The actor matches the title against the catalog's own brand facet for the query; generic or unbranded listings are returned without `brand`.

**Why do some reviews have no photos?**
Only reviews that include customer images carry an `images` array. Use `withImagesOnly` to keep only those.

**Can I get reviews for several products at once?**
Yes. Put multiple URLs or IDs in `productUrls`. `maxReviews` is the total cap across all of them.

**Is product-detail data always complete?**
Core pricing and review data is. Extended detail fields such as `description` and `specifications` depend on the product API being reachable from the run's network exit; when it is not, the record still carries the search-card price and the review rollup.

# Actor input Schema

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

What to collect: keyword search results, a department, product details, or customer reviews.

## `keywords` (type: `string`):

Free-text search query, e.g. `towel`, `comforter set`, `kitchen island`.

## `category` (type: `string`):

Browse one of the site's home-goods departments. The department name is used through the catalog's own search relevance; direct category-browse pages are bot-protected (see README).

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

One or more bedbathandbeyond.com product-page URLs or numeric product IDs, e.g. `https://www.bedbathandbeyond.com/.../5296998/product.html` or `5296998`.

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

How products are ordered. Applied client-side to the fetched result window because the site's sort control is not honoured by a plain HTTP request (see README).

## `minPrice` (type: `integer`):

Drop products priced below this amount. Sent to the catalog as a server-side price filter.

## `maxPrice` (type: `integer`):

Drop products priced above this amount. Sent to the catalog as a server-side price filter.

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

For products: drop products rated below this. For reviews: drop reviews below this star rating.

## `maxRating` (type: `integer`):

For products: drop products rated above this. For reviews: drop reviews above this star rating.

## `onSaleOnly` (type: `boolean`):

Only emit products currently marked on sale.

## `fastShippingOnly` (type: `boolean`):

Only emit products eligible for two-day delivery.

## `brandContains` (type: `string`):

Keep only products whose detected brand or title contains this text (case-insensitive), e.g. `Superior`, `SAFAVIEH`, `KitchenAid`.

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

Hard cap on emitted product records (search, department and product modes).

## `reviewSort` (type: `string`):

How customer reviews are ordered.

## `maxReviews` (type: `integer`):

Hard cap on emitted review records across all product URLs/IDs in the run.

## `verifiedOnly` (type: `boolean`):

Only emit reviews marked as verified purchases.

## `withImagesOnly` (type: `boolean`):

Only emit reviews that include at least one customer photo.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": "bedding",
  "category": "Bedding",
  "productUrls": [],
  "sortBy": "relevance",
  "onSaleOnly": false,
  "fastShippingOnly": false,
  "brandContains": "",
  "maxItems": 3,
  "reviewSort": "newest",
  "maxReviews": 50,
  "verifiedOnly": false,
  "withImagesOnly": false
}
```

# Actor output Schema

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

Dataset containing all scraped products.

# 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 = {
    "mode": "search",
    "keywords": "bedding",
    "category": "Bedding",
    "productUrls": [],
    "sortBy": "relevance",
    "onSaleOnly": false,
    "fastShippingOnly": false,
    "brandContains": "",
    "maxItems": 3,
    "reviewSort": "newest",
    "maxReviews": 50,
    "verifiedOnly": false,
    "withImagesOnly": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/bed-bath-and-beyond-price-and-rewards-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 = {
    "mode": "search",
    "keywords": "bedding",
    "category": "Bedding",
    "productUrls": [],
    "sortBy": "relevance",
    "onSaleOnly": False,
    "fastShippingOnly": False,
    "brandContains": "",
    "maxItems": 3,
    "reviewSort": "newest",
    "maxReviews": 50,
    "verifiedOnly": False,
    "withImagesOnly": False,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/bed-bath-and-beyond-price-and-rewards-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 '{
  "mode": "search",
  "keywords": "bedding",
  "category": "Bedding",
  "productUrls": [],
  "sortBy": "relevance",
  "onSaleOnly": false,
  "fastShippingOnly": false,
  "brandContains": "",
  "maxItems": 3,
  "reviewSort": "newest",
  "maxReviews": 50,
  "verifiedOnly": false,
  "withImagesOnly": false
}' |
apify call dataspryva/bed-bath-and-beyond-price-and-rewards-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/bed-bath-and-beyond-price-and-rewards-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/QSbHlUkcMGIxMZfPM/builds/bmgo5xS2OisyIRhiV/openapi.json
