# Shopify App Store Scraper — Apps, Pricing, Reviews & Developers (`tortuga/shopify-app-store-scraper`) Actor

Shopify App Store data: apps from search, categories, developers or URLs with rating, review count, pricing plans, Built for Shopify badge, developer website and support email, plus merchant reviews.

- **URL**: https://apify.com/tortuga/shopify-app-store-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 app details

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

## Shopify App Store Scraper — Apps, Pricing, Reviews & Developers

Scrape [apps.shopify.com](https://apps.shopify.com): apps from keyword searches, categories, developer pages, guides and app URLs with rating, review count, pricing plans, the Built for Shopify badge and the developer's website, address and support email, plus merchant reviews with the developer's replies. Built for Shopify app developers, agencies and investors doing competitor research, pricing benchmarks and lead generation.

Export to JSON, CSV or Excel, or pull the dataset through the API into Google Sheets, your CRM or an LLM pipeline. No login, no browser, no cookies.

### What can this Shopify App Store scraper do?

- **App details** (`details` mode, default): one full profile per app — tagline, description and feature bullets, rating and 1-5 star histogram, review count, every pricing plan (name, price, billing period, free trial, extra charges, plan features), Built for Shopify and Build Award badges, categories with their feature tags, languages, "works with" integrations, launch date, changelog, privacy policy / FAQ / documentation links, demo store, screenshots, and the developer's name, App Store page, website, address and support email as published on the listing.
- **Search and category rankings** (`listings` mode): the app cards of a search, category, developer or guide page in ranking order (24 apps per request), with rank, rating, review count, pricing line, tagline and Built for Shopify. Paid placements ("Ad") are skipped or flagged. The cheapest way to track rankings or build a list of every app in a niche.
- **Reviews** (`reviews` mode): merchant reviews of any app — star rating, text, date, edited flag, store name and country, time using the app, and the developer's reply with its date. Filter by star rating (e.g. only 1-2 star complaints about a competitor), newest first or most relevant.
- **Monitoring**: scheduled runs that output only new reviews, or only apps whose rating, review count or pricing changed.

### How to scrape Shopify App Store apps

1. Enter **Search keywords** (e.g. `product reviews`), or paste app, category, developer or search URLs into **Start URLs**, or app handles into **App handles** (the part after `apps.shopify.com/`, e.g. `judgeme`).
2. Pick **What to scrape**: App details, Search / category cards only, or Reviews.
3. Set **Max items** to cap the run and the cost, then click **Start**.

#### Input example: app details for a search

```json
{
  "mode": "details",
  "searchTerms": ["product reviews"],
  "maxItems": 50
}
```

Other inputs: `startUrls` such as `https://apps.shopify.com/categories/marketing-and-conversion-social-trust-product-reviews` (feature filters in the URL are kept), `https://apps.shopify.com/partners/judge-me` (all apps of a developer) or `https://apps.shopify.com/search?q=bundles`; `maxAppsPerSource` to spread the budget over several searches; `includeAds` to also output the paid placements.

#### Output example: app

```json
{
  "appId": "8c8e0c8b87fd02ccf30e1a6de052e0ca",
  "handle": "klaviyo-reviews",
  "appUrl": "https://apps.shopify.com/klaviyo-reviews",
  "name": "Klaviyo: Product Reviews",
  "tagline": "Collect product reviews and star ratings over email and SMS",
  "rating": 4.8,
  "reviewCount": 231,
  "ratingHistogram": { "5": 204, "4": 12, "3": 5, "2": 3, "1": 7 },
  "pricingSummary": "Free to install",
  "hasFreePlan": true,
  "hasFreeTrial": false,
  "planPrices": ["Free: Free to install", "Reviews: $25/month"],
  "pricingPlans": [
    {
      "name": "Reviews",
      "priceText": "$25/month",
      "price": 25.0,
      "currency": "USD",
      "billingPeriod": "month",
      "yearlyOption": null,
      "freeTrial": null,
      "additionalCharges": "Up to 250 orders, upgrade as you grow.",
      "features": ["All free features", "Review request timing based on delivery"]
    }
  ],
  "pricingNote": "External charges may be billed by Klaviyo separately from your Shopify invoice.",
  "builtForShopify": false,
  "awards": [],
  "developerName": "Klaviyo",
  "developerUrl": "https://apps.shopify.com/partners/klaviyo",
  "developerWebsite": "https://www.klaviyo.com",
  "developerAddress": "125 Summer St, Floor 7, Boston, MA, 02111, US",
  "developerCountryCode": "US",
  "developerSupportEmail": "support@klaviyo.com",
  "privacyPolicyUrl": "https://www.klaviyo.com/legal/privacy-policy",
  "launchedDate": "2022-06-09",
  "categories": ["Product reviews"],
  "languages": ["English", "Spanish", "French", "German", "Italian", "Korean", "Portuguese (Brazil)"],
  "worksWith": ["Shopify Flow"],
  "featureBullets": ["Automate review requests with email and SMS flows", "Showcase top reviews in emails & on your website"],
  "description": "Klaviyo Reviews collects text, photo, and video reviews with automated email and SMS requests…",
  "source": "search: product reviews",
  "position": 6,
  "isAd": false,
  "scrapedAt": "2026-10-11T19:05:12+00:00"
}
```

#### App fields

| Field | Description |
|---|---|
| `handle`, `appUrl`, `appId` | App handle (URL slug), listing URL and Shopify's app API key |
| `name`, `tagline`, `introduction` | App name, subtitle and short intro |
| `rating`, `reviewCount`, `ratingHistogram` | Average stars, number of reviews, reviews per star (1-5) |
| `pricingSummary`, `hasFreePlan`, `hasFreeTrial` | Pricing line as shown ("From $24.99/month. Free trial available.") and flags |
| `pricingPlans` | Every plan: `name`, `priceText`, `price`, `currency`, `billingPeriod`, `yearlyOption`, `freeTrial`, `additionalCharges`, `features` |
| `planPrices`, `pricingNote`, `pricingPageUrl` | Plans in one line each, external-charges note, the developer's pricing page if linked |
| `builtForShopify`, `awards` | Built for Shopify badge, Build Award wins |
| `developerName`, `developerUrl` | Developer and their App Store developer page |
| `developerWebsite`, `developerAddress`, `developerCountryCode`, `developerSupportEmail` | Contact details the developer publishes on the listing |
| `supportNote`, `privacyPolicyUrl`, `faqUrl`, `tutorialUrl`, `documentationUrl`, `changelogUrl` | Support and resource links |
| `launchedDate` | Date the app launched on the App Store (YYYY-MM-DD) |
| `descriptionHeadline`, `description`, `featureBullets` | Listing copy |
| `categories`, `categoryDetails` | Categories, with the feature tags the developer selected in each |
| `languages`, `worksWith` | Supported languages, integrations / surfaces the app works with |
| `merchantsSummary` | Shopify's AI summary of the reviews ("What merchants think"), when shown |
| `demoStoreUrl`, `iconUrl`, `screenshots` | Demo store, icon and screenshot URLs |
| `source`, `position`, `isAd` | Where the app was found (search / category / app URL) and its rank there |

`listings` mode outputs the card fields only: `handle`, `appUrl`, `name`, `tagline`, `rating`, `reviewCount`, `pricingSummary`, `builtForShopify`, `awards`, `iconUrl`, `appId`, `isAd`, `position`, `source`, `sourceUrl`, `page`.

### How to scrape Shopify app reviews

Set **What to scrape** to Reviews and give the apps as handles, app URLs or review URLs (`https://apps.shopify.com/judgeme/reviews?ratings[]=1` keeps the star filter). A search or category works too: the reviews of each listed app are read, `maxAppsPerSource` limits how many apps.

```json
{
  "mode": "reviews",
  "appHandles": ["klaviyo-email-marketing"],
  "reviewRatings": ["1", "2"],
  "maxReviewsPerApp": 200,
  "maxItems": 200
}
```

#### Output example: review

```json
{
  "reviewId": "2380223",
  "appHandle": "klaviyo-email-marketing",
  "appName": "Klaviyo: Email Marketing & SMS",
  "appUrl": "https://apps.shopify.com/klaviyo-email-marketing",
  "rating": 1,
  "text": "It’s okay but when trying to cancel it makes it extremely hard. …",
  "date": "2026-10-01",
  "edited": false,
  "storeName": "The Little Rainbow Company Limited",
  "storeCountry": "New Zealand",
  "usageDuration": "Almost 3 years using the app",
  "developerReply": "We appreciate you for sharing this feedback regarding your experience with the cancellation process. …",
  "developerReplyDate": "2026-10-02",
  "developerReplyBy": "Klaviyo",
  "reviewUrl": "https://apps.shopify.com/reviews/2380223",
  "scrapedAt": "2026-10-11T19:13:28+00:00"
}
```

Reviews without text (rating only) have `text: null`; `usageDuration` and `developerReply` are null when the page shows none.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a Schedule (Apify Console: **Saved tasks** -> **Schedule**, for example daily). Each run remembers what earlier runs of the same input returned and outputs only what is new: reviews not seen before in `reviews` mode (read newest first, stopping where the previous run's reviews begin), and apps whose rating, review count or pricing line changed in `details` and `listings` mode — for apps found through a search or category this is decided on the card, before the app page is opened. Unchanged items are skipped before they are saved, so they are not charged. **Only reviews newer than** takes a date or a period such as `2 days`, which bounds how far back the first run reads. Monitored items carry `changeType` (`new` or `changed`) and, for changed apps, `previousValues` with the old values (e.g. `{"reviewCount": 9828}`); use **Monitoring key** to keep several schedules on the same input apart.

### Can I find Shopify app developers' emails and websites?

Yes. Every app listing shows the developer's website, business address and support email in its "Developer" section, and `details` mode exports them (`developerWebsite`, `developerAddress`, `developerCountryCode`, `developerSupportEmail`) together with the developer's App Store page. Run a category or search to build a list of app companies in a niche, or a developer page (`/partners/<name>`) to get all apps of one company.

### How much does it cost?

You pay per result, nothing per run: app details $0.0035 per app, search / category cards $0.0015 per app, reviews $0.0008 per review (plus Apify platform usage, a few cents per thousand items). 1,000 reviews cost about $0.80; a full profile of the top 100 apps in a category about $0.35. In monitoring mode unchanged items are free.

### Does it work without login or a proxy?

It reads the public App Store pages with plain HTTP requests: no Shopify login, no partner account, no API key. The default Apify datacenter proxy is enough; requests that hit the App Store's rate limit are retried with a new IP.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets; the actor is also callable by AI agents through Apify's MCP server.

### Is it legal to scrape the Shopify App Store?

This actor collects only what the public App Store pages show to every visitor: app listings, prices, the business contact details developers publish for support, and merchant reviews with the store names Shopify displays. It does not log in or access anything private. You are responsible for how you use the data and for complying with Shopify's terms and the laws that apply to you (e.g. GDPR when you contact developers).

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

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

details: one full profile per app (description, pricing plans, developer website, address and support email, categories and features, languages, integrations, rating histogram). listings: only the search / category / developer cards (rank, rating, review count, pricing line, tagline, Built for Shopify), cheapest and fastest. reviews: merchant reviews of the apps (rating, text, date, store name and country, time using the app, developer reply).

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

Keywords to search on the Shopify App Store, e.g. "product reviews" or "upsell". Results are read in the order the App Store ranks them; paid placements are skipped unless Include ads is on.

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

Any apps.shopify.com page: app pages (https://apps.shopify.com/judgeme), review pages (https://apps.shopify.com/judgeme/reviews, star filters kept), categories (https://apps.shopify.com/categories/marketing-and-conversion-social-trust-product-reviews, feature filters kept), developer pages (https://apps.shopify.com/partners/judge-me), search pages (https://apps.shopify.com/search?q=bundles) and guide pages (apps.shopify.com/stories/...).

## `appHandles` (type: `array`):

Shortcut for app URLs: the part after apps.shopify.com/ in an app link, e.g. "judgeme" or "klaviyo-email-marketing".

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

Stop after this many items in total (apps, cards or reviews across all inputs). Keeps cost predictable: no app page is requested for an app that would not fit.

## `maxAppsPerSource` (type: `integer`):

Optional cap per search keyword, category or developer page, so several searches share the budget. In reviews mode it limits how many apps of each listing are read. Leave empty for no cap.

## `includeAds` (type: `boolean`):

Also output the paid placements ("Ad") the App Store shows on top of search and category pages, flagged with isAd: true. Off by default: ads repeat on every page and are not part of the ranking.

## `maxReviewsPerApp` (type: `integer`):

Reviews mode only: cap per app, so a run over several apps spreads the budget. Leave empty for all reviews (up to Max items).

## `reviewsSort` (type: `string`):

Reviews mode only: newest first (default, needed for date limits and monitoring) or the App Store's "Most relevant" order.

## `reviewRatings` (type: `array`):

Reviews mode only: keep only reviews with these star ratings, e.g. 1 and 2 for complaints about a competitor. The filter is applied by the App Store, so you do not pay for other reviews. Leave empty for all.

## `reviewsNewerThan` (type: `string`):

Reviews mode only: a date (YYYY-MM-DD) or a period such as "7 days" or "24 hours". Reviews are read newest first and paging stops at the first page that is entirely older, so a scheduled run only fetches what is new. Reviews show whole days, so a review dated on the cutoff day is included.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this input returned and output only new items or items whose rating, review count or pricing changed (reviews mode: only reviews no earlier run output; paging stops where the previous run's reviews begin). Use with a Schedule; unchanged items are not charged.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input. Only used with Only new or changed items.

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

Apify datacenter proxy works for the Shopify App Store (no Unblocker or residential proxy needed). The actor rotates IPs and retries when the App Store rate-limits a request (HTTP 429).

## Actor input object example

```json
{
  "mode": "details",
  "searchTerms": [
    "product reviews"
  ],
  "maxItems": 100,
  "includeAds": false,
  "reviewsSort": "newest",
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "product reviews"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/shopify-app-store-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 = {
    "searchTerms": ["product reviews"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/shopify-app-store-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 '{
  "searchTerms": [
    "product reviews"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/shopify-app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tortuga/shopify-app-store-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/Kkdy1OJOCb1xgWLlg/builds/f7WWNXdpLO1CTgCIk/openapi.json
