Apify Store Competitor Analyzer: Pricing, Users & Revenue avatar

Apify Store Competitor Analyzer: Pricing, Users & Revenue

Pricing

from $3.50 / 1,000 actor row returneds

Go to Apify Store
Apify Store Competitor Analyzer: Pricing, Users & Revenue

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 in eventTieredPricingUsd, one price per plan. Reading only eventPriceUsd makes 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 freePlanPriceMultiple shows 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. matchMode decides (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 actorReviewRating in 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). rating is the Store page value and ratingActorStats the 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. shareDenominator states 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); changes gives the previous and current table;
  • users-changed: 30-day users moved by at least userChangePercent % and userChangeMinimum users.

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

FieldTypeDefaultWhat it does
searchTermslist(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.
categorieslistnoneStore 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).
actorIdslistnoneSpecific 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.
matchModeselecttitletitle: all words in the title or name. titleOrDescription: also the description. store: the Store's results as they are.
maxActorsPerQueryinteger10Actors 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.
maxStoreResultsinteger1000Store results read per term before matching, 100 to 3,000.
minUsers30Daysinteger0Leave out Actors with fewer 30-day users.
includeApifyOwnedbooleantrueKeep Actors published by Apify itself.
includeUnrunnableActorsbooleanfalseInclude Actors the Store API hides by default (for example from unverified developers).
minUsersForPriceBandinteger5The summary's price band uses only Actors with at least this many 30-day users.
includeReviewsbooleanfalseAdd the written reviews (rating, date, text, whether the developer replied), lowest rating first. Reviewer names are not returned. No extra charge.
maxReviewsPerActorinteger5Reviews per Actor, 1 to 50.
onlyChangesbooleanfalseMonitor mode (see above).
watchNamestringnoneName of the remembered state. With it set and onlyChanges off, all top Actors are returned with changeType filled.
resetMonitoringStatebooleanfalseForget what this watch remembered.
userChangePercentinteger20Smallest user move (percent) reported in monitor mode.
userChangeMinimuminteger5Smallest 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 includeUnrunnableActors is 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.