# Shopify Fera Reviews Scraper API (`lurkapi/shopify-fera-reviews-scraper-api`) Actor

Scrape Fera product reviews and site reviews from any Shopify store URL or product URL.

- **URL**: https://apify.com/lurkapi/shopify-fera-reviews-scraper-api.md
- **Developed by:** [LurkAPI](https://apify.com/lurkapi) (community)
- **Categories:** Agents, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reviews

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

## Shopify Fera Reviews Scraper API

Export public Fera product reviews and site reviews from Shopify stores into one clean spreadsheet. Collect a store's public review history, pull one product's feedback, mine low-star comments, or build a structured review dataset ready to filter, analyze, and export.

### 🎬 What it does

Paste a Shopify store URL, product URL, or landing page that contains a Fera product-review widget. Get back public Fera reviews in structured rows.

Three kinds of input:

1. **Store URL** returns public product reviews and site reviews across the store, including reviews imported from public channels. Good for reputation monitoring, catalog research, and recurring brand reports.
2. **Product URL** returns reviews attached to that Shopify product, with public price, currency, and availability when the storefront provides them. Good for product research, quote pulls, and launch analysis.
3. **Landing page URL** returns the embedded product's reviews when a readable product widget is present. Otherwise, the page is treated as a store-wide target. Good for featured products and custom storefront pages outside the standard `/products/` path.

Shape the results before you pay for them:

- **Free filters and sorts**: keep any mix of 1 to 5 stars, verified buyers only, or reviews containing a keyword. Sort by newest, oldest, highest rating, lowest rating, best quality, photos first, videos first, or any media first.
- **Paid advanced filters**: photos only, videos only, either type of media, store replies only, written or rating-only content, an inclusive date window, selected source channels, or selected languages.
- **Paid enrichments**: sort by most helpful, detect review language, translate review titles and text, and archive customer photos or videos to run storage.

Equivalent inputs and repeated reviews collapse automatically. Inputs from the same store share one delivery cap, and explanatory status rows are always free.

Good for Shopify founders tracking customer feedback, agencies preparing recurring client reports, researchers studying verified buyer sentiment, and analysts building ecommerce review datasets.

### 📋 How to use it

#### Step 1: Paste your inputs

Drop any combination into **Store, product, or landing page URLs**, one per line. Duplicate URL variants are cleaned up automatically.

- **Store URL**: `https://carnivalcoffee.co.uk/`
- **Product URL**: `https://carnivalcoffee.co.uk/products/carnival-club`
- **Landing page URL**: any public page on the same storefront that embeds a Fera product-review widget

Minimum input, ready to run:

```json
{
  "startUrls": [
    "https://carnivalcoffee.co.uk/products/carnival-club"
  ],
  "maxResultsPerUrl": 50
}
```

`maxResultsPerUrl` is the only result limit you need. The default is 50 and the maximum is 50,000. The cap is shared by all inputs from the same store domain, so overlapping store, product, and landing-page targets do not multiply the delivered-row limit.

#### Step 2: Pick filters and add-ons

Free filters and sorts:

- **Star rating filter**: keep any combination of 1 to 5 stars.
- **Verified only**: only reviews marked as verified buyers.
- **Keyword search**: only reviews whose title or text contains your phrase, case-insensitive.
- **Sort order**: Newest, Oldest, Highest rating, Lowest rating, Best quality, Photos first, Videos first, or Any media first.

Paid add-ons are billed only when they contribute to a delivered result:

- **Media filters**: only reviews with a photo, only with a video, or only with either.
- **Store-reply filter**: only reviews with a public merchant reply.
- **Written-content filter**: all reviews, reviews with written text, or rating-only reviews.
- **Date range**: only reviews posted between two inclusive dates.
- **Source-channel filter**: keep native store reviews or selected imported channels such as Google, Etsy, or AliExpress.
- **Language filter and detection**: keep selected languages or add `detectedLanguage` when detection succeeds.
- **Most helpful sort**: order delivered reviews by their public helpful-vote count.
- **Translation**: translate review titles and text into the selected language when text is available.
- **Media archiving**: save up to 10 photos or videos per review with a 3 MB limit per file, billed only per file stored successfully.

Use the **Output fields** section to turn off optional columns you do not need. Core status, row type, product and review IDs, rating, text, scrape time, and error fields remain available for reliable downstream processing.

#### Step 3: Run it and get your results

Click **Start**. Rows stream into the Output tab as they arrive. The Actor provides four ready-made dataset views and one media-storage link:

- **Overview**: the most useful columns across product reviews, site reviews, and explanatory rows.
- **Product reviews**: review text, ratings, reviewer signals, replies, media, links, and product context.
- **Site reviews**: reviews about the store itself, including public source-channel and store-rating details.
- **Language & Media**: detected language, translated text, source media, and archived-file references.
- **Downloaded media**: photos and videos archived by this run when media archiving is enabled.

Every row includes `status` and `rowType`. `status: "Success"` means the row contains a public review. `rowType` is `review` for product reviews, `store_review` for site reviews, or `status` for an explanation. Explanatory rows include a stable `error` code such as `invalid_url`, `fera_not_detected`, `product_unavailable`, or `no_matching_reviews`, and are never charged as Review events.

Download the dataset as JSON, CSV, or Excel from Storage, or read it through the Apify API.

### 💰 Pricing

Pay only for starting the run, delivered reviews, and optional enhancements that actually produce value.

| Event | Price | When |
|---|---:|---|
| Actor Start | **$0.001 per event** | when the Actor starts; one event per GB of memory, minimum one |
| Review | **$0.0015 per row** ($1.50 per 1,000) | per product or site review delivered |
| Add-on: Advanced filter | **$0.0005 per row** ($0.50 per 1,000) | per delivered review retained by one or more paid post-fetch filters |
| Add-on: Custom sort | **$0.0005 per row** ($0.50 per 1,000) | per delivered review ordered using Most helpful |
| Add-on: Language detected | **$0.0005 per row** ($0.50 per 1,000) | per delivered review whose language is detected successfully |
| Add-on: Review translated | **$0.002 per row** ($2.00 per 1,000) | per delivered review whose translated title or text is returned |
| Add-on: Media downloaded | **$0.001 per file** ($1.00 per 1,000) | per review photo or video archived successfully |

Star-rating filtering, verified-buyer filtering, keyword search, all other sorts, public source media URLs, standard output fields, and explanatory status rows are included with the base review price. See the pricing panel on the Actor page for the configured prices when the Actor is published.

### 💡 Good to know

- **Store URLs cover the public store-wide feed.** They can return product reviews and site reviews together, including reviews imported from other public channels.
- **Product URLs stay product-specific.** They return reviews attached to the Shopify product ID resolved from that page.
- **Landing pages preserve their path.** If the page exposes an embedded product identity, the Actor returns that product's reviews. Otherwise it falls back to the store-wide feed.
- **The cap is shared by store.** Inputs from one store domain share `maxResultsPerUrl`, and each review is delivered at most once per run.
- **Deduplication is automatic.** Common hostname variants, trailing slashes, query strings, fragments, and repeated review IDs do not create duplicate rows.
- **Not on Fera?** If a store runs Okendo, Loox, Yotpo, Judge.me, or Junip instead, an uncharged status row names the detected provider and links to the matching sibling Actor.
- **Status rows are never charged.** Unsupported providers, unavailable products, empty public feeds, filtered-out results, and rejected URLs return a stable `error` value that explains the outcome.
- **Field coverage matches the public source.** If Fera or the storefront did not publish a requested value, the field returns `null`. Fields turned off in **Output fields** are omitted.
- **Media limits are strict.** Up to 10 files per review and 3 MB per file. A file is billed only after it is stored successfully.
- **Runs are independent.** No cross-run history is kept. Schedule runs and compare `reviewId` values on your side to track new reviews.
- Files and datasets live in your Apify storage. Retention depends on the Apify plan of the account running the Actor.

### ❓ FAQ

**Do I need a Fera or Shopify account?**
No. The Actor reads only publicly published storefront and review data.

**What if a store does not use Fera?**
You get one uncharged status row that explains the outcome. When the Actor recognizes a supported sibling widget, it names and links the matching scraper.

**Why did a store URL return product reviews and site reviews together?**
Fera's public store-wide feed can contain both. Use `rowType` to separate product reviews from reviews about the store, and `sourceChannel` to distinguish native and imported sources.

**How does a landing page work?**
The Actor reads the exact public page you submit. If it finds a readable product identity in the embedded Fera widget, it uses product scope; otherwise it uses store scope.

**What if no reviews match?**
You get an uncharged status row with `error: "no_matching_reviews"`. It can mean the target has no public reviews or the selected filters removed every review.

**Why are some fields null?**
Not every public review includes every value. `null` means the field was requested but the source did not publish a value. A field disabled in **Output fields** is omitted instead.

**Can I schedule this?**
Yes. Use Apify Schedules to run on any cadence and compare `reviewId` across snapshots to track new reviews.

**Can I export to Excel or Google Sheets?**
Yes. Open the run's Storage tab and choose CSV, Excel, JSON, or another supported format. CSV and Excel files can be imported into Google Sheets.

**Which stores work?**
Publicly reachable Shopify storefronts that publish reviews through Fera. Product and landing-page targets also need a readable public product identity to use product scope.

**How long are my results stored?**
Results live in the Apify dataset and downloaded media lives in the run's key-value store. Retention depends on your Apify plan.

### 🔗 Other tools you might like

- [Shopify Okendo Reviews Scraper API](https://apify.com/lurkapi/shopify-okendo-reviews-scraper-api): reviews and product data from Shopify stores using Okendo.
- [Shopify Loox Reviews Scraper API](https://apify.com/lurkapi/shopify-loox-reviews-scraper-api): reviews and product data from Shopify stores using Loox.
- [Shopify Yotpo Reviews Scraper API](https://apify.com/lurkapi/shopify-yotpo-reviews-scraper-api): reviews and product data from Shopify stores using Yotpo.
- [Shopify Judge.me Reviews Scraper API](https://apify.com/lurkapi/shopify-judge-me-reviews-scraper-api): reviews and product data from Shopify stores using Judge.me.
- [Shopify Junip Reviews Scraper API](https://apify.com/lurkapi/shopify-junip-reviews-scraper-api): product reviews and site reviews from Shopify stores using Junip.

### ⚖️ Disclaimer

This tool is intended for lawful use with publicly available data. You are responsible for complying with Shopify's and Fera's terms and any laws that apply in your jurisdiction. The developer is not liable for misuse. Data availability depends on the storefront's public configuration at run time.

**Keywords:** shopify reviews, fera reviews, shopify review scraper, fera review scraper, product reviews export, shopify site reviews, review dataset, verified buyer reviews, ecommerce review data, customer review analytics

# Actor input Schema

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

Paste a Shopify store URL to collect public Fera reviews across that store, a product URL to collect one product's reviews, or a landing page that embeds a product review widget. These URL types can be mixed in one run.

## `maxResultsPerUrl` (type: `integer`):

Maximum review rows delivered for each store domain in this run.

## `filterRatings` (type: `array`):

Only keep reviews with the selected star ratings. Leave empty to include every rating. Free with the base row price.

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

Only keep reviews marked as verified. Free.

## `searchText` (type: `string`):

Only keep reviews whose title or body contains this phrase. Case-insensitive and free.

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

All choices except Most helpful are free. Most helpful is computed after collection and counts as an add-on.

## `onlyWithPhotos` (type: `boolean`):

Only keep reviews that include at least one customer photo.

## `onlyWithVideos` (type: `boolean`):

Only keep reviews that include at least one customer video.

## `onlyWithMedia` (type: `boolean`):

Only keep reviews that include at least one photo or video.

## `merchantReplyOnly` (type: `boolean`):

Only keep reviews where the store replied publicly.

## `reviewContent` (type: `string`):

Keep every review, only reviews with written text, or only star ratings without text.

## `filterStartDate` (type: `string`):

Only keep reviews posted on or after this date, inclusive.

## `filterEndDate` (type: `string`):

Only keep reviews posted on or before this date, inclusive.

## `filterChannels` (type: `array`):

Only keep reviews from these channels. Use native for store-collected reviews, or codes such as google, etsy, or aliexpress for imported reviews.

## `filterLanguages` (type: `array`):

Only keep reviews in these languages. Use codes such as en, eng, es, spa, or pt-BR. This also turns language detection on.

## `detectLanguage` (type: `boolean`):

Add detectedLanguage when detection succeeds on a delivered review.

## `translateReviews` (type: `boolean`):

Translate the review title and text into the selected target language.

## `translationTarget` (type: `string`):

Target language code, such as en, es, fr, de, ja, or pt-BR.

## `downloadMedia` (type: `boolean`):

Save up to 10 photos or videos per review, with a 3 MB limit per file. Source URLs remain available without this option.

## `outputStoreDomain` (type: `boolean`):

Normalized store hostname.

## `outputStoreUrl` (type: `boolean`):

Canonical store home page URL.

## `outputStoreSummary` (type: `boolean`):

Store name, country, average rating, and total review count.

## `outputProductHandle` (type: `boolean`):

Product URL slug.

## `outputProductTitle` (type: `boolean`):

Public product name.

## `outputProductUrl` (type: `boolean`):

Canonical product link.

## `outputProductImageUrl` (type: `boolean`):

Product thumbnail URL.

## `outputProductRating` (type: `boolean`):

Average rating, review count, and 1 to 5 star counts.

## `outputPrice` (type: `boolean`):

Public price when a product URL supplies it.

## `outputCurrency` (type: `boolean`):

Storefront currency code when detected.

## `outputAvailable` (type: `boolean`):

Whether the product is publicly available.

## `outputReviewTitle` (type: `boolean`):

Review headline when present.

## `outputPublishedAt` (type: `boolean`):

Published and updated timestamps.

## `outputReviewerName` (type: `boolean`):

Public display name, public location, and anonymous flag.

## `outputVerifiedBuyer` (type: `boolean`):

Whether the review is marked verified.

## `outputReply` (type: `boolean`):

Public reply, author, and timestamp.

## `outputChannel` (type: `boolean`):

Review source channel and public link.

## `outputHelpfulCount` (type: `boolean`):

Public helpful-vote count.

## `outputMediaUrls` (type: `boolean`):

Customer photo, video, and thumbnail URLs.

## `outputReviewUrl` (type: `boolean`):

Public storefront review link.

## `outputInputUrl` (type: `boolean`):

Input URL that produced the row.

## Actor input object example

```json
{
  "startUrls": [
    "https://carnivalcoffee.co.uk/products/carnival-club"
  ],
  "maxResultsPerUrl": 50,
  "filterRatings": [],
  "verifiedOnly": false,
  "sortBy": "newest",
  "onlyWithPhotos": false,
  "onlyWithVideos": false,
  "onlyWithMedia": false,
  "merchantReplyOnly": false,
  "reviewContent": "all",
  "filterChannels": [],
  "filterLanguages": [],
  "detectLanguage": false,
  "translateReviews": false,
  "translationTarget": "en",
  "downloadMedia": false,
  "outputStoreDomain": true,
  "outputStoreUrl": true,
  "outputStoreSummary": true,
  "outputProductHandle": true,
  "outputProductTitle": true,
  "outputProductUrl": true,
  "outputProductImageUrl": true,
  "outputProductRating": true,
  "outputPrice": true,
  "outputCurrency": true,
  "outputAvailable": true,
  "outputReviewTitle": true,
  "outputPublishedAt": true,
  "outputReviewerName": true,
  "outputVerifiedBuyer": true,
  "outputReply": true,
  "outputChannel": true,
  "outputHelpfulCount": true,
  "outputMediaUrls": true,
  "outputReviewUrl": true,
  "outputInputUrl": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Compact mixed view of all product reviews, site reviews, and explanatory rows.

## `reviews` (type: `string`):

One row per public product review, including reviewer signals, replies, media, and product context.

## `storeReviews` (type: `string`):

One row per public review about the store itself, including reviews imported from other channels.

## `enrichments` (type: `string`):

Detected language, translations, source media, and archived file references.

## `mediaFiles` (type: `string`):

Review photos and videos that this run archived to the default key-value store.

# 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 = {
    "startUrls": [
        "https://carnivalcoffee.co.uk/products/carnival-club"
    ],
    "maxResultsPerUrl": 50,
    "filterRatings": [],
    "sortBy": "newest",
    "filterChannels": [],
    "filterLanguages": [],
    "translationTarget": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/shopify-fera-reviews-scraper-api").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 = {
    "startUrls": ["https://carnivalcoffee.co.uk/products/carnival-club"],
    "maxResultsPerUrl": 50,
    "filterRatings": [],
    "sortBy": "newest",
    "filterChannels": [],
    "filterLanguages": [],
    "translationTarget": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("lurkapi/shopify-fera-reviews-scraper-api").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 '{
  "startUrls": [
    "https://carnivalcoffee.co.uk/products/carnival-club"
  ],
  "maxResultsPerUrl": 50,
  "filterRatings": [],
  "sortBy": "newest",
  "filterChannels": [],
  "filterLanguages": [],
  "translationTarget": "en"
}' |
apify call lurkapi/shopify-fera-reviews-scraper-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lurkapi/shopify-fera-reviews-scraper-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mghvKUXgZDewxcWyC/builds/G5oijYBsro1RV43Nz/openapi.json
