Shopify App Store Scraper · Apps, Pricing, Reviews & Ranks avatar

Shopify App Store Scraper · Apps, Pricing, Reviews & Ranks

Pricing

from $2.20 / 1,000 app returneds

Go to Apify Store
Shopify App Store Scraper · Apps, Pricing, Reviews & Ranks

Shopify App Store Scraper · Apps, Pricing, Reviews & Ranks

Shopify App Store scraper to extract apps, pricing plans, developer info, ratings, and reviews. Scrape Shopify App Store category listings or search queries for ecommerce market research and competitor tracking.

Pricing

from $2.20 / 1,000 app returneds

Rating

0.0

(0)

Developer

Tarek Etman

Tarek Etman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

reapX — public sources in, addressable records out

Shopify App Store Scraper · Apps, Pricing, Reviews & Ranks

Shopify App Store scraper to scrape app listings, pricing plans, developer info, ratings, and user reviews from the Shopify App Store marketplace. Get structured data per app: developer name, star rating, review count, monthly pricing tiers, launch date, and category rank.

Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/shopify-app-store-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me

Extract data by category slugs, search terms, or specific app handles for ecommerce market research and competitor analysis.

What you get per app

Field
appHandlethe app's permanent identifier, stable across runs
appName · developer · developerHandlewho publishes it
descriptionthe listing's own summary
ratingValue · reviewCountmerchant rating out of 5, and how many reviews it rests on
pricingPlansevery plan: name, price as shown, monthly USD figure, fine print
lowestPaidPlanUsd · highestPaidPlanUsd · hasFreePlanthe pricing shape at a glance
categorySlug · categoryRankwhere it sits in the category listing, 1 being the top slot
launchedOn · iconUrl · appUrl · retrievedAt

How to find a category slug

Open any category on the App Store and take the last segment of the URL. https://apps.shopify.com/categories/marketing-and-conversion-marketingmarketing-and-conversion-marketing. There are 161 of them, from store-design-search-and-navigation to orders-and-shipping-returns-and-warranty.

Track a competitor's pricing

Put the competitor's handles in Specific app handles and schedule the run daily. Each run captures the full plan ladder as advertised that day, so a price change, a new tier or a dropped free plan shows up as a diff between two rows with the same appHandle.

Watch a category's ranking

Set one category, raise Category pages to read, and schedule it. categoryRank is the listing position at run time, so consecutive runs show which apps climbed and which slipped.

Find apps by how they charge

Pricing model filters to free-only, freemium (a free plan and a paid plan) or paid. Combine with Minimum number of reviews to separate established apps from new listings.

Input configuration

Every field is optional. The prefilled values below are what runs if you press Start without changing anything.

What to list

Give categories, specific app handles, or both. Leave everything empty to list the marketing category.

FieldTypeAcceptsWhat it does
categorieslistone value per lineApp Store category slugs, one per line, taken from the end of a category URL - for example marketing-and-conversion-marketing, store-design-search-and-navigation, orders-and-shipping-inventory. Apps are returned in the order the category ranks them. Prefilled with ["marketing-and-conversion-marketing"].
appHandleslistone value per lineIndividual apps to pull, one per line, using the handle from the listing URL - klaviyo-email-marketing, judgeme-product-reviews, or a full https://apps.shopify.com/... URL.
pagesPerCategoryinteger1 to 20How deep to go down each category listing. Each page holds about 30 apps. Prefilled with 1.

Filters

All optional. Applied after each app's listing page is read.

FieldTypeAcceptsWhat it does
searchTermstringfree textKeep only apps whose name, description or developer contains this text. Matching is case-insensitive.
minRatinginteger0 to 5Keep only apps rated at least this highly out of 5. Apps with no rating are dropped.
minReviewsinteger0 to 100000Keep only apps with at least this many merchant reviews - a proxy for how established an app is.
pricingstringany, free, freemium, paidRestrict to apps by how they charge. Prefilled with "any".

Output

How many rows you get and how politely they are fetched.

FieldTypeAcceptsWhat it does
maxAppsinteger1 to 2000Hard ceiling on the rows this run produces, and therefore on what it costs. You are charged per app returned. Prefilled with 30.
requestsPerSecondinteger1 to 6Politeness against the Shopify App Store. Lower this if you see the source refusing requests. Prefilled with 3.

Pricing

Pay per event. The primary event is App returned (app-returned), charged at $0.004 per event on the free plan, falling to $0.002 on the highest tier.

One Shopify App Store listing delivered as a complete row, including its rating, review count and every advertised pricing plan. Blocked sources and empty result sets are never charged.

Minimum charge cap per run: $0.02.

Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.

Usage examples

The prefilled run, which is what Start does with nothing changed

{
"categories": [
"marketing-and-conversion-marketing"
],
"pagesPerCategory": 1,
"pricing": "any",
"maxApps": 30,
"requestsPerSecond": 3
}

Filter by app store categories

{
"categories": [
"marketing-and-conversion-marketing",
"store-management-finances"
],
"pagesPerCategory": 1,
"pricing": "any",
"maxApps": 30,
"requestsPerSecond": 3
}

Filter by specific app handles

{
"categories": [
"marketing-and-conversion-marketing"
],
"pagesPerCategory": 1,
"pricing": "any",
"maxApps": 30,
"requestsPerSecond": 3,
"appHandles": [
"klaviyo-email-marketing",
"judgeme-product-reviews"
]
}

Filter by category pages to read

{
"categories": [
"marketing-and-conversion-marketing"
],
"pagesPerCategory": 3,
"pricing": "any",
"maxApps": 30,
"requestsPerSecond": 3
}

Filter by keyword

{
"categories": [
"marketing-and-conversion-marketing"
],
"pagesPerCategory": 1,
"pricing": "any",
"maxApps": 30,
"requestsPerSecond": 3,
"searchTerm": "email"
}

Output example

One row, exactly as the actor wrote it to the dataset:

{
"appHandle": "transtore-language-and-currency",
"appName": "TS ‑ AI Language Translate",
"developer": "Transtore",
"developerHandle": "transtore-app",
"description": "Free AI localization app: Translate your store into multi languages, convert currencies, auto-switch language & currency with geolocation to boost global sales.",
"ratingValue": 4.6,
"reviewCount": 723,
"pricingPlanCount": 0,
"pricingPlans": [],
"lowestPaidPlanUsd": null,
"highestPaidPlanUsd": null,
"hasFreePlan": false,
"launchedOn": "November 4, 2022",
"categorySlug": "store-design-internationalization",
"categoryRank": 1,
"iconUrl": "https://cdn.shopify.com/app-store/listing_images/ae0c66bf70ba73592fdf83cdeef87f99/icon/CNP7vuKwlJEDEAE=.png",
"appUrl": "https://apps.shopify.com/transtore-language-and-currency",
"retrievedAt": "2026-08-03T05:22:23Z"
}

Fields on every row

FieldTypeWhat it is
appHandlestringThe app's permanent identifier - the last path segment of its App Store listing URL. Stable across runs and unique per app.
appNamestringThe listing's display name as shown in the App Store.
developerstringThe partner or company that publishes the app.
developerHandlestringThe developer's partner-page identifier, usable to find their other apps.
descriptionstringThe listing's own summary of what the app does.
ratingValuenumberAverage merchant rating out of 5, as published on the listing.
reviewCountintegerHow many merchant reviews the rating is computed from.
pricingPlanCountintegerHow many pricing plans the listing advertises.
pricingPlanslistEvery advertised plan in listing order, each with its name, the price exactly as shown, the monthly figure in USD where one is stated, and the plan's fine print.
lowestPaidPlanUsdnumberThe lowest monthly price across the app's paid plans. Null when the app has no paid plan.
highestPaidPlanUsdnumberThe highest monthly price across the app's paid plans. Null when the app has no paid plan.
hasFreePlantrue/falseTrue when at least one advertised plan carries no monthly price - free, or free to install.
launchedOnstringThe date the listing states the app went live on the App Store.
categorySlugstringThe category listing this app was found in. Null for apps requested by handle.
categoryRankintegerThe app's position in that category's listing at the time of the run - 1 is the top slot. Null for apps requested by handle.
iconUrlstringThe app's listing icon, served from Shopify's CDN.
appUrlstringThe app's public App Store page.
retrievedAtstringWhen this row was read from the App Store, in UTC.

3 named dataset views ship with it: Apps, Pricing, Category ranking. They drive the Output tab in Console and the Output block on the Actor's .md page.

FAQ

How many apps are there? The App Store's English index lists over 24,000. This actor reads them through the category listings, so how many you get is set by how many categories you give it and how deep you read.

Does it need an API key or a Shopify store? No. Everything it reads is the public listing, fetched over plain HTTP with no browser and no login.

How fresh is the rating? It is read from the listing page during the run, so it is as fresh as the page itself.

Why is categoryRank null on some rows? Apps requested by handle were not discovered through a category listing, so they have no rank in one.

What is the stable identifier? appHandle. It is the app's permanent URL segment and the right key to join runs together over time.


Unofficial - not affiliated with Shopify. Collects public data only. reapx. Contact reapxdev@proton.me.

The full published archive

Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent can resolve an entity without running anything. Nothing on those pages is estimated or modelled.

🧪 Example input

A real, runnable configuration — this is an actual input this Actor has run with.

{
"categories": [
"store-management-operations"
],
"pagesPerCategory": 6,
"searchTerm": "report",
"maxApps": 120,
"requestsPerSecond": 3
}

📄 Sample output

One real row from a real run of this Actor, unedited.

{
"appHandle": "report-pundit",
"appName": "Report Pundit: Custom Reports",
"developer": "Estore Automate",
"developerHandle": "developer-23d31008208ecfb7",
"description": "Shopify Report customizations, automated report scheduling, and 30+ app data integration to analyze Sales, Inventory, Tax, Payout, Shipping, Customers, and more",
"ratingValue": 5,
"reviewCount": 1860,
"pricingPlanCount": 4,
"pricingPlans": [
{
"planName": "Free Plan",
"planPrice": "Free",
"planPriceUsd": null,
"planNote": null
},
{
"planName": "Basic",
"planPrice": "$9/month",
"planPriceUsd": 9,
"planNote": "Stores currently subscribed to the Basic Shopify plan"
},
{
"planName": "Grow",
"planPrice": "$19/month",
"planPriceUsd": 19,
"planNote": "Stores currently subscribed to the Shopify plan"
},
{
"planName": "Advanced",
"planPrice": "$35/month",
"planPriceUsd": 35,
"planNote": "Stores currently subscribed to the Advanced Shopify plan"
}
],
"lowestPaidPlanUsd": 9,
"highestPaidPlanUsd": 35,
"hasFreePlan": true,
"launchedOn": "August 13, 2019",
"categorySlug": "store-management-operations",
"categoryRank": 8,
"iconUrl": "https://cdn.shopify.com/app-store/listing_images/e7fb8d7846c3a07de88275837088b3d2/icon/CIfrncu774cDEAE=.jpeg",
"appUrl": "https://apps.shopify.com/report-pundit",
"retrievedAt": "2026-08-03T11:05:46Z"
}

How it works

  1. You set the filters below, or none at all - every field is optional.
  2. The Actor calls the public apps.shopify.com API directly over HTTP. There is no key to obtain, no login and no headless browser, so a run is fast and cannot break on a UI change.
  3. It pages through the results at the rate the source asks for, honouring Retry-After rather than retrying into a harder block.
  4. Every row is pushed to the dataset as it is built - never buffered to the end. A run that hits its time limit still returns everything it collected.
  5. You are charged app-returned at $0.004 per row, and nothing for Apify platform usage. The maximum-results field is therefore your cost cap, and Apify Store discounts apply on top.

💬 Your feedback

Found a bug, or need a field this does not return yet? Open an issue on the Actor's Issues tab, or write to reapxdev@proton.me. Bugs get fixed and reasonable field requests get added.

⚠️ Run outcomes and error handling

This Actor reports what happened in the run's status message, and it always keeps whatever it collected. These are the outcomes you can get and what each one means.

OutcomeWhat it means
SuccessRows were returned and you were charged app-returned at $0.004 per row.
No matchesThe source returned nothing for your filters. Nothing is charged. Widen the date window or drop a filter.
Partial - time limitThe run reached its time limit. It stops collecting about 45 seconds early, pushes what it has and finishes SUCCEEDED with a status message saying how far it got. The dataset is correct as far as it went; it is never truncated silently.
Partial - source refusedThe source rate-limited or refused some requests. The affected items are skipped and named in the log, and everything already collected is still pushed. A block never discards a run's work.

What is guaranteed either way

  • Every row is pushed as it is built, not buffered to the end of the run. Anything that buffers output loses everything to a timeout, a block or a migration; this does not.
  • Retry-After is respected. When the source asks for a pause, the Actor waits the time it asked for instead of retrying into a harder block.
  • Requests go through Apify's datacenter proxy group, so concurrent runs do not share a single egress IP.
  • A field absent from the source is absent from the row. Nothing is inferred, modelled or filled in to make a row look complete.

🧭 Ready-made configurations

These are saved, published configurations of this exact Actor. Open one and run it as it is, or copy its input as a starting point - each link is a live page with the full input and its output schema.

ConfigurationInput
Marketing Apps on the Shopify App Storecategories: marketing-and-conversion-marketing; pagesPerCategory: 3; maxApps: 90
Advertising Apps on the Shopify App Storecategories: marketing-and-conversion-advertising; pagesPerCategory: 3; maxApps: 90
Social Proof & Trust Apps on the Shopify App Storecategories: marketing-and-conversion-social-trust; pagesPerCategory: 3; maxApps: 90
Upsell & Bundles Apps on the Shopify App Storecategories: marketing-and-conversion-upsell-and-bundles; pagesPerCategory: 3; maxApps: 90
Checkout Apps on the Shopify App Storecategories: marketing-and-conversion-checkout; pagesPerCategory: 3; maxApps: 90
Customer Loyalty Apps on the Shopify App Storecategories: marketing-and-conversion-customer-loyalty; pagesPerCategory: 3; maxApps: 90
Gifting Apps on the Shopify App Storecategories: marketing-and-conversion-gifts; pagesPerCategory: 3; maxApps: 90
Storefront Design Apps on the Shopify App Storecategories: store-design-storefronts; pagesPerCategory: 3; maxApps: 90
Search & Navigation Apps on the Shopify App Storecategories: store-design-search-and-navigation; pagesPerCategory: 3; maxApps: 90
Notifications Apps on the Shopify App Store-
Images & Media Apps on the Shopify App Store-
Internationalization Apps on the Shopify App Store-
Product Display Apps on the Shopify App Store-
Design Elements Apps on the Shopify App Store-

There are 48 of these in total, all listed on the Actor's Examples tab.