Apify Store Competitor Analyzer: Pricing, Users & Revenue
Pricing
from $3.50 / 1,000 actor row returneds
Apify Store Competitor Analyzer: Pricing, Users & Revenue
For Apify developers and AI agents choosing what to build and price: every competitor for a Store search, category or Actor list, ranked by 30-day users, with runs, fail rate, rating, paid-plan price, start fee and revenue estimate. 'truth social' finds 422 Actors; 46 really match. Monitor mode.
Pricing
from $3.50 / 1,000 actor row returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
For AI agents and Apify developers deciding what to build or how to price it: give a search term, a Store category or a list of Actors, and get every competitor ranked by 30-day users, with runs, runs per user, fail rate, rating, age, the price on each plan (primary event per 1,000 and start fee, read from the tiered price table), scheduled price changes and a revenue estimate on the paid plan, plus one summary row per term with the leader's share and the paid-plan price band. Monitor mode returns only new competitors, price changes and big user swings.
It reads only Apify's own public API (/v2/store, /v2/acts/<id>) and, if you ask for them, the public written reviews. No login, no proxy and no Apify token of yours are needed.
Input and output at a glance
{ "searchTerms": ["truth social"], "maxActorsPerQuery": 3 }
One row per Actor (shortened, real values from 2026-09-25):
{"status": "ok","query": "truth social","rankByUsers30Days": 1,"storeSearchPosition": 1,"fullName": "muhammetakkurtt/truth-social-scraper","users30Days": 113,"runs30Days": 32441,"runsPerUser30Days": 287.1,"failRate30DaysPct": 0,"rating": 4.42,"ratingActorStats": 1.85,"reviewCount": 11,"ageDays": 723,"pricingModel": "PAY_PER_EVENT","primaryEventName": "post","primaryPricePer1kUsdFreePlan": 5,"primaryPricePer1kUsdPaidPlan": 4,"startFeeUsd": { "FREE": 0.01, "BRONZE": 0.005, "SILVER": 0.004, "GOLD": 0.003, "PLATINUM": 0.003, "DIAMOND": 0.003 },"estimatedCreatorRevenue30dUsd": 233.58,"estimateBasis": "Estimated, not measured: 30-day runs x (start fee + 1 primary-event item) at the BRONZE price ..."}
And one free summary row per search term:
{"status": "summary","query": "truth social","storeResultsRead": 422,"matchedActors": 46,"users30DaysTotal": 276,"leaderFullName": "muhammetakkurtt/truth-social-scraper","leaderSharePct": 40.9,"shareDenominator": "all matched Actors, including those published by Apify itself","paidPlanPricePer1kUsdBand": { "actors": 8, "min": 0.55, "p25": 1.75, "median": 2, "p75": 4.25, "max": 5 },"paidPlanStartFeeUsdBand": { "actors": 8, "min": 0.0001, "p25": 0.005, "median": 0.005, "p75": 0.0063, "max": 0.05 }}
Why the numbers are different from a plain Store scraper
These are the mistakes we made ourselves while measuring the Store by hand; this Actor avoids each of them.
- Most prices are not in
eventPriceUsd. They sit ineventTieredPricingUsd, one price per plan. Reading onlyeventPriceUsdmakes most paid Actors look free. Every row gives the primary event per 1,000 and the start fee on all six plans. - The free-plan price is not what paying customers pay. Many Actors charge free-plan users 2x to 100x the paid-plan price. Free-plan users earn the developer nothing, so the revenue estimate uses the BRONZE (lowest paid plan) price, and
freePlanPriceMultipleshows the gap. - Start fees are kept apart from the per-item price, so a $0.01 start fee never shows up as "$10 per 1,000". A start fee is recognized by its one-time flag, by names such as actor-start, run_start, run-started or ActorRunStarted, and by titles such as "Actor Start", because many Actors name it something other than actor-start.
- The Store search is loose. It also matches words in descriptions and READMEs: "truth social" returns 422 Actors, only 46 of which have both words in the title or name.
matchModedecides (strict by default), and the no-matches row says how many had the words only in the description. - The Store listing lags. Row values come from
/v2/acts/<id>, not from the cached Store listing. The summary row, which covers every matched Actor, says it is built from the listing. - The rating the Store page shows is not always the one in the Actor statistics. On 2026-09-25, 169 of 719 rated Actors in our sample had a different
actorReviewRatingin their statistics than on their Store page (one showed 4.4 on the page and 1.85 in the statistics; some show 0 with five reviews).ratingis the Store page value andratingActorStatsthe other one, so you can see both. - 30-day users come from
totalUsers30Days(there is no user count inside the 30-day run statistics). - Market share says what it counts.
shareDenominatorstates whether Actors published by Apify itself are in the denominator (includeApifyOwned).
Revenue estimate: what it is and what it is not
estimatedCreatorRevenue30dUsd = 30-day runs x (start fee + 1 primary-event item, both at the BRONZE price) x the creator share (100% minus the Apify margin of the current price entry; 80% when not published).
It is an estimate, and the column says so. It counts every run as a paying customer's run returning one item: runs by free-plan users earn the developer nothing (real revenue can be lower), and runs returning many items earn more (it can be higher). Platform usage costs are not subtracted. Rental (monthly) and free Actors are not estimated. estimatedCustomerSpend30dUsd is the same without the creator share.
Monitor mode
Set onlyChanges and a watchName, then schedule the Actor (for example daily). The first run returns the top Actors as the starting point. Later runs return only:
new-competitor: an Actor that was not in the matched results of that search term or category before (anywhere in the list, not only the top);price-changed: any change in the price table (event names, any plan, start fee, pricing model);changesgives the previous and current table;users-changed: 30-day users moved by at leastuserChangePercent% anduserChangeMinimumusers.
A run in which nothing changed returns one free no-change row per query and charges only the run start fee. Changes that could not be returned (the per-query cap or your maximum charge) are not remembered, so the next run returns them.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
searchTerms | list | (example: google maps scraper) | Store search terms. Each returns the top Actors plus a free summary row. If searchTerms, categories and actorIds are all empty, the example term is used. |
categories | list | none | Store categories (AI, AGENTS, AUTOMATION, BUSINESS, COVID_19, DEVELOPER_EXAMPLES, DEVELOPER_TOOLS, ECOMMERCE, FOR_CREATORS, GAMES, JOBS, LEAD_GENERATION, MARKETING, NEWS, SEO_TOOLS, SOCIAL_MEDIA, TRAVEL, VIDEOS, REAL_ESTATE, SPORTS, EDUCATION, INTEGRATIONS, OTHER, OPEN_SOURCE, MCP_SERVERS). |
actorIds | list | none | Specific Actors as username/actor-name, username~actor-name, Actor ID or apify.com URL (up to 500). The same Actor given twice is returned and charged once. |
matchMode | select | title | title: all words in the title or name. titleOrDescription: also the description. store: the Store's results as they are. |
maxActorsPerQuery | integer | 10 | Actors returned (and charged) per search term or category, 1 to 200. An Actor already returned for an earlier term in the same run is not repeated or charged again; the summary row counts it in alreadyReturnedEarlierInRun. |
maxStoreResults | integer | 1000 | Store results read per term before matching, 100 to 3,000. |
minUsers30Days | integer | 0 | Leave out Actors with fewer 30-day users. |
includeApifyOwned | boolean | true | Keep Actors published by Apify itself. |
includeUnrunnableActors | boolean | false | Include Actors the Store API hides by default (for example from unverified developers). |
minUsersForPriceBand | integer | 5 | The summary's price band uses only Actors with at least this many 30-day users. |
includeReviews | boolean | false | Add the written reviews (rating, date, text, whether the developer replied), lowest rating first. Reviewer names are not returned. No extra charge. |
maxReviewsPerActor | integer | 5 | Reviews per Actor, 1 to 50. |
onlyChanges | boolean | false | Monitor mode (see above). |
watchName | string | none | Name of the remembered state. With it set and onlyChanges off, all top Actors are returned with changeType filled. |
resetMonitoringState | boolean | false | Forget what this watch remembered. |
userChangePercent | integer | 20 | Smallest user move (percent) reported in monitor mode. |
userChangeMinimum | integer | 5 | Smallest user move (users) reported in monitor mode. |
Output columns
Per Actor: status, query, queryType, storeSearchPosition (where the Store's own search puts it), rankByUsers30Days, matchedIn, actorId, fullName, title, url, developerUsername, isApifyOwned, categories, description, users30Days, users7Days, users90Days, usersAllTime, runs30Days, runsPerUser30Days, succeededRuns30Days, failedRuns30Days, timedOutRuns30Days, abortedRuns30Days, failRate30DaysPct (failed + timed out, over all runs), rating (as on the Store page), ratingSource, ratingActorStats, reviewCount, bookmarkCount, createdAt, ageDays, modifiedAt, lastRunStartedAt, daysSinceLastRun, pricingModel, primaryEventName, primaryEventPricePer1kUsd (all plans), primaryPricePer1kUsdFreePlan, primaryPricePer1kUsdPaidPlan, freePlanPriceMultiple, startFeeUsd (all plans), flatMonthlyPriceUsd, pricingEvents (every event with its price on each plan), minimalMaxTotalChargeUsd, priceStartedAt, priceChangesSoFar, scheduledPriceChange, estimatedCustomerSpend30dUsd, estimatedCreatorRevenue30dUsd, creatorShare, estimateBasis, agenticPaymentsEnabled, badge, notice, isDeprecated, reviews, reviewsNote, changeType, changes, previousCheckedAt, watchName, note, checkedAt.
Summary row (covers every matched Actor, before minUsers30Days): matchMode, storeResultsRead, storeResultsTotal, matchedActors, analyzedActors, alreadyReturnedEarlierInRun, users30DaysTotal, actorsWithAnyUsers30Days, actorsWithUsersForBand, leaderFullName, leaderUsers30Days, leaderSharePct, shareDenominator, apifyOwnedActors, apifyOwnedUsers30Days, paidPlanPricePer1kUsdBand, paidPlanStartFeeUsdBand, priceBandBasis, estimatedCustomerSpend30dUsdAllMatched, estimatedCreatorRevenue30dUsdAllMatched, estimateBasis.
Free rows that say why: no-matches, not-found (private and deleted Actors look the same to the public API), bad-input, unreachable (the API did not answer after 5 tries), budget-reached, no-change, more-changes-not-returned, already-returned (monitor mode: the changes of this term were returned for an earlier term in the same run).
Pricing
Pay per event: one run start fee per run that returns at least one Actor row (or, in monitor mode, that compared the Store), and one Actor row fee per Actor returned. Summary rows, reviews and every row that says why nothing was returned are free. A run whose maximum total charge has no room for the start fee plus one row requests nothing and is charged nothing.
Limits
- Only public Actors are visible to the public API. The Store API hides some Actors unless
includeUnrunnableActorsis on. - Users and runs are Apify's 30-day statistics; the Store listing used for the summary and for monitor comparisons can lag the per-Actor numbers by about a day.
- The monitor memory is a named key-value store in your account; two runs of the same watch finishing at the same moment can still overwrite each other.
Support
Questions and requests: open an issue on the Issues tab of this Actor.