# Macy's Review Scraper ⭐️ (`mrdoe/macys-review-scraper`) Actor

Scrape product reviews from Macys.com ratings, titles, review text, authors, dates — fast, clean, and affordable. No login, no API key, no Macy's account. Batch multiple product IDs in one run. Built for sentiment analysis, reputation monitoring, and voice-of-customer research.

- **URL**: https://apify.com/mrdoe/macys-review-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 results

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?

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

### What does Macy's Review Scraper do?

**Macy's Review Scraper** extracts customer reviews from [Macys.com](https://www.macys.com) product pages - rating, title, review text, author, date, and more - **anonymously, no login, no Macy's account, no API key**. Pass one or many product IDs; each run returns the reviews Macy's server-renders on that product's page, plus the product's aggregate rating stats for context.

### Why use this Actor?

- **Voice-of-customer analysis** - pull real review text at scale for sentiment/keyword analysis without an API key.
- **Reputation monitoring** - schedule on a cron and diff runs to catch new reviews (especially 1-2 star ones) as they land.
- **Batch, one start fee** - pass a list of product IDs and one run covers all of them.

### How to use it

1. Fill `productId` (e.g. `25155177`) or a full product URL, or `productIds` for a batch.
2. Optionally set `maxItems` to cap total review rows across the whole run.
3. Click **Start**.

Batch fields (`productIds`) win over their singular counterpart when filled; duplicates and blanks are dropped automatically.

### Input

| Field                      | Type           | Description                                                          |
| -------------------------- | -------------- | -------------------------------------------------------------------- |
| `productId` / `productIds` | string / array | A Macy's numeric product ID (e.g. `25155177`) or a full product URL. |
| `maxItems`                 | integer        | Total run cap on review rows across all products. Default `100`.     |
| `proxyConfiguration`       | object         | A residential proxy is strongly recommended for sustained volume.    |

### Output

One row per review, with the parent product's title/brand/aggregate rating repeated on every row for convenience. A product with zero reviews still produces one row with `status: "no_reviews"` so a batch run's output accounts for every input ID.

```json
{
    "productId": "25155177",
    "productTitle": "Women's Mavis High Top Wedge Sneakers",
    "brand": "Steve Madden",
    "overallRating": 4.6,
    "totalReviewCount": 176,
    "reviewId": "400972133",
    "rating": 5,
    "title": "So cute",
    "reviewText": "They are so cute and they match my outfit in they my style",
    "authorNickname": "Antquan L.",
    "submissionTime": "Aug 20, 2026",
    "recommended": false,
    "hasPhotos": false,
    "incentivized": true,
    "syndicated": true,
    "syndicationSource": "Steven Madden",
    "productUrl": "https://www.macys.com/shop/product/product?ID=25155177",
    "status": "success"
}
```

### Pricing

This Actor uses pay-per-event pricing - one small run-start charge, then a per-review charge. The first 10 review rows across the whole run are always free. See the **Pricing** tab for current rates. Failed lookups land as `status: "error"` rows and are never charged.

### Limitations - please read

- **Anonymous review ceiling is one page per product.** Macy's server-renders reviews from a Bazaarvoice-backed widget sorted "Newest first" - live-verified 2026-08-24: a real product with 176 total reviews exposed exactly 8 in the embedded payload. No query-param combination (`reviewsPage`, `reviewPage`, `page`, `reviewsOffset`) changed that page-1 result, and the site's own dedicated review-listing route either redirects back to the same product page or returns a 403 without a signed-in session. So `maxItems` bounds *total rows across a batch of product IDs*, not reviews-per-product - each product realistically contributes only as many rows as it has reviews, up to roughly 8.
- Reviews are always newest-first; there is no sort/filter input in this version, matching what an anonymous visitor actually sees.
- `incentivized`/`syndicated` flags reflect Bazaarvoice's own labels (e.g. a manufacturer-seeded review program) - shown as-is, not altered.
- Only the numbers/text Macy's shows to an anonymous, logged-out visitor are available.
- US site (macys.com) only in this version.
- See the companion **Macy's Product Scraper** for search results and full product detail.

### FAQ

**Why do I only get a handful of reviews per product?** That's the real anonymous ceiling - see Limitations above. It matches what you'd see as a logged-out visitor without clicking "sign in" anywhere on the page.

**Do I need a Macy's account or API key?** No - it runs entirely against Macy's public, logged-out web pages.

### Disclaimer

This Actor is an independent tool, not affiliated with or endorsed by Macy's, Inc. or Bazaarvoice, Inc. It only accesses data Macy's serves publicly to anonymous visitors. Use it in compliance with Macy's Terms of Use and applicable law in your jurisdiction. Found a bug or have a feature request? Use the Issues tab on this Actor's page.

# Actor input Schema

## `productId` (type: `string`):

A Macy's numeric product ID (e.g. "25155177") or a full product URL (e.g. "https://www.macys.com/shop/product/...?ID=25155177"). Defaults to a demo product if left blank.

## `productIds` (type: `array`):

Many product IDs or product URLs in one run. Wins over "productId" when filled.

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

Stops the run once this many review rows have been pushed in total, across all products. Each product page only exposes a handful of reviews anonymously (see the Actor's README) - this caps spend on a large batch of product IDs.

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

A residential proxy is strongly recommended for sustained volume.

## Actor input object example

```json
{
  "productId": "25155177",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `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 = {
    "productId": "25155177"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/macys-review-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 = { "productId": "25155177" }

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/macys-review-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 '{
  "productId": "25155177"
}' |
apify call mrdoe/macys-review-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/macys-review-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/3TXB70KtZxsrKtf4p/builds/qyhMAnhshBYmQOghy/openapi.json
