# Salesforce AppExchange Scraper & Listing Monitor (`signalscope-data/appexchange-tracker`) Actor

Scrape & monitor Salesforce AppExchange apps, agents and ISVs: ratings, reviews, review insights vs competitors, pricing, versions, HQ country, market reports. $2 per 1,000 listings.

- **URL**: https://apify.com/signalscope-data/appexchange-tracker.md
- **Developed by:** [Bin](https://apify.com/signalscope-data) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listings

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

## Salesforce AppExchange Scraper & Listing Monitor

Search, rank and **monitor Salesforce AppExchange** apps, components, flows and Agentforce agents. Get one clean record per listing: rating, review count, categories, publisher, listing type and AI agent/action counts. Turn on **details** to add pricing plans and starting price, published date, latest package version and release date, security review date, editions, required Salesforce products, industries and publisher HQ / founded year / website.

Turn on change tracking and every run is compared with the previous one. You get **new listings, review jumps, rating moves, rank changes, renames, new package versions and price changes**, so a daily schedule becomes an AppExchange alert feed.

New: **publisher (ISV) level**. `outputLevel: "publishers"` gives one row per AppExchange vendor: website domain, HQ, founded year, employees, every listing they publish, total reviews, weighted rating, categories, pricing models, latest release and last security review. Use it for ISV market maps, partner lists and account research, and monitor it for **new vendors, new listings and review growth**.

New: **market reports and HQ-country filters**. `includeMarketReport` (or `marketReportOnly`) adds one aggregated row per keyword/category: rating distribution, review concentration, top vendors, pricing-model mix, median price per user/month, new listings in the last 90/365 days, release freshness and publisher HQ countries. Filter listings by **publisher HQ country** (`hqCountries`), **pricing model** and **minimum rating**.

New: **review insights & competitor comparison**. `includeReviewInsights` reads each app's newest reviews and returns one `review-insights` row per listing: rating trend, **top complaint themes** (bugs, setup & implementation, integration & sync, limits & performance, support, pricing & licensing, contract & renewal…) with example quotes, **what reviewers praise** (support, ease of use, fast implementation, time saved, native to Salesforce…), feature requests and reply rate. With 2+ apps you also get a `review-comparison` row: an issue and praise matrix per 100 reviews and each app's **relative weaknesses and strengths** vs its competitors.

No login, no API key, no browser. The Actor uses AppExchange's public JSON endpoints, so it's fast and cheap.

### Why this one?

- **Monitor mode built in.** `outputMode: "new"` returns only listings never seen before (new apps in your category). `"changed"` adds `reviews-up`, `rating-up` / `rating-down`, `rank-up` / `rank-down`, `entered-list`, `renamed`, `agents-added`, `new-version` and `price-change`.
- **Whole categories in one query.** List every app in `sales`, `quotesAndOrders`, `customerService`… (up to ~1,700 per category), not just the first page.
- **Strict keyword matching.** AppExchange search is semantic and returns loosely related apps even for nonsense queries. Strict mode keeps only listings that actually contain your keywords.
- **User reviews + new-review alerts.** `includeReviews` adds each app's AppExchange reviews (rating, title, text, date, likes, comment thread) — thousands deep, filterable to critical ones (`maxReviewRating: 2`) or a date range. In monitor mode later runs return only reviews posted since the last run. Reviewer names are not exported.
- **Review insights, not just review dumps.** Rule-based (no AI, reproducible) complaint and praise themes per 100 reviews, rating trend (last 12 months vs older) and a side-by-side competitor comparison — e.g. "Docusign: 2.6★, bugs & errors and support complaints far above the e-signature peers; S-Docs: more praise for support and ease of use".
- **Release & pricing intelligence.** Latest version and release date, days since last release, security review date, starting price per user/month and all pricing plans.
- **Agentforce-ready.** `agentCount`, `actionCount`, `topicCount`, `mcpServerCount` and the `force/copilot` listing type let you track the AI agent ecosystem.
- **One row per vendor (ISV).** `outputLevel: "publishers"` groups listings by publisher and adds each vendor's **full AppExchange portfolio** (their other listings are found automatically), with company firmographics and portfolio totals. Monitor mode flags `new` vendors, `new-listing`, `listing-removed`, `reviews-up` and rating changes.
- **Category market report in one row.** `marketReportOnly: true` sizes a niche without exporting every listing: how crowded it is, who owns the reviews (top-10 share), what apps cost (p25 / median / p75 per user per month), how many apps launched this year and how many have not shipped a release in 2 years.
- **HQ country, pricing and rating filters.** AppExchange stores HQ as free text ("San Francisco, CA", "Munich"); every detail row gets a normalised `publisherCountry`, so `hqCountries: ["UK", "Germany"]` just works. Combine with `pricingModels: ["paid"]` and `minRating: 4`.
- **No contact harvesting.** Publisher emails and phone numbers are deliberately not exported.

### Use cases

- **ISVs / Salesforce app vendors:** track your listing and competitors' daily: review velocity, rating, rank for your main keywords, new entrants in your category, competitor releases and price changes.
- **Salesforce consultancies & SIs:** build a vetted app catalog per practice area (CPQ, field service, document generation) with ratings, review counts and pricing.
- **Partner / alliance teams:** spot new apps that integrate with your platform, and which vendors ship Agentforce agents.
- **Sales & account research for the Salesforce ecosystem:** list every ISV in a category (CPQ, document generation, field service) with website domain, HQ, size, number of apps and review traction, then enrich with your own CRM data.
- **Product & competitive intel:** pull every 1–2★ review of competing apps to see what customers complain about; get a daily feed of new reviews on your own listing.
- **Competitive battlecards:** run `includeReviewInsights` on your app and 3–5 competitors to see where each one is weak (`relativeWeaknesses`) and what customers love about them (`topPraise`), with real quotes for sales enablement.
- **Investors & market research:** size categories, find fast-growing apps (review velocity), or long-unreleased apps (`daysSinceRelease`) that could be acquisition targets.
- **Market sizing for founders & PMs:** before building a Salesforce app, run `marketReportOnly` on your keyword to see competition, price points and how active incumbents are.
- **Regional partner lists:** every CPQ or document-generation app from UK- or DACH-based vendors (`hqCountries`).

### Input

| Field | Description |
|---|---|
| `keywords` | Search terms, e.g. `"cpq"`, `"e-signature"`, `"data backup"`, `"ai agent"` |
| `strictSearch` | Keep only listings containing every keyword (default `true`) |
| `categories` | Category slugs, e.g. `sales`, `quotesAndOrders`, `customerService`, `fieldService`. Without keywords the whole category is listed |
| `publishers` | Vendor filter, e.g. `"Conga"`. Used alone, it searches and returns that vendor's listings |
| `listingIds` | Watchlist: listing IDs (`a0N30000001f1q1EAA`) or listing URLs |
| `sortBy` | `relevance`, `popularity`, `rating`, `reviews`, `name` |
| `maxResultsPerQuery` | Max listings per keyword / category (default 100, max 3,000) |
| `includeDetails` | Add pricing, versions, security review, editions, publisher HQ (extra event) |
| `outputLevel` | `listings` (default) or `publishers` (one row per vendor with its full portfolio) |
| `maxListingsPerPublisher` | Publisher level: cap on listings per vendor (default 50; Salesforce Labs alone has 270+) |
| `listingTypes` | Filter by technology, e.g. `force/package`, `force/copilot` (agents), `force/flow` |
| `minReviews` | Skip listings with fewer reviews |
| `minRating` | Skip listings rated below this (unrated listings are skipped too) |
| `hqCountries` | Publisher HQ countries, e.g. `"United States"`, `"UK"`, `"Germany"`, `"India"` (loads details) |
| `pricingModels` | `free`, `freemium`, `paid`, `free_to_install` (loads details) |
| `includeMarketReport` | Add one `market-report` row per keyword / category |
| `marketReportOnly` | Output only the market report rows (no listing rows) |
| `includeReviews`, `maxReviewsPerListing`, `reviewsSince`, `maxReviewRating` | Review rows: how many (newest first), since when, only low ratings |
| `includeReviewInsights` | One `review-insights` row per listing + a `review-comparison` row (sample = `maxReviewsPerListing` newest reviews) |
| `outputMode` | `all`, `new` (never seen before) or `changed` (new + any change) |
| `trackChanges` | Add change fields in `all` mode too |
| `minReviewsChange`, `minRankChange` | Alert thresholds |
| `stateKey` | Monitor name: use one per schedule |

Example: daily alert of new apps in the Quotes & Orders category:

```json
{
  "categories": ["quotesAndOrders"],
  "maxResultsPerQuery": 3000,
  "outputMode": "new",
  "stateKey": "new-cpq-apps"
}
```

Example: market report for CPQ apps (no listing rows):

```json
{
  "keywords": ["cpq"],
  "maxResultsPerQuery": 60,
  "includeDetails": true,
  "marketReportOnly": true
}
```

Example: paid, well-rated CPQ apps from UK and German vendors:

```json
{
  "keywords": ["cpq"],
  "hqCountries": ["UK", "Germany"],
  "pricingModels": ["paid"],
  "minRating": 4
}
```

Example: competitor watch with pricing and release alerts:

```json
{
  "keywords": ["cpq"],
  "maxResultsPerQuery": 50,
  "includeDetails": true,
  "outputMode": "changed",
  "stateKey": "cpq-competitors"
}
```

### Output

```json
{
  "id": "a0N30000001f1q1EAA",
  "name": "RevOps for Salesforce / Native CPQ / Quote to Cash / Subscription Billing / RLM",
  "publisher": "Kugamon",
  "url": "https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000001f1q1EAA",
  "listingType": "force/package",
  "categories": ["sales", "contractManagement", "quotesAndOrders"],
  "rating": 4.9,
  "reviewCount": 134,
  "agentCount": 0,
  "mcpServerCount": 0,
  "tagline": "Trust Your Pipeline Revenue Again | 100% Fast | 100% Lightning",
  "publishedDate": "2009-08-05",
  "latestVersion": "10.5.5",
  "latestVersionName": "Summer 2026",
  "latestVersionDate": "2026-08-26T18:10:03.000Z",
  "daysSinceRelease": 39,
  "securityReviewDate": "2023-10-06",
  "pricingModel": "paid",
  "priceFrom": 65,
  "priceUnit": "user",
  "priceFrequency": "monthly",
  "currency": "USD",
  "editions": ["EE", "UE", "DE", "PP"],
  "productsRequired": ["Sales Cloud", "Service Cloud"],
  "testDriveAvailable": true,
  "publisherWebsite": "http://www.kugamon.com",
  "publisherHQ": "San Francisco, CA",
  "publisherFounded": 2009,
  "rank": 1,
  "query": "search:cpq",
  "isNew": false,
  "previousReviewCount": 131,
  "reviewsChange": 3,
  "previousVersion": "10.5.4",
  "changeTypes": ["reviews-up", "new-version"],
  "scrapedAt": "2026-10-05T08:00:00.000Z"
}
```

#### Review rows (`includeReviews`)

```json
{
  "recordType": "review",
  "reviewId": "a6HHu000002vH4LMAU",
  "listingId": "a0N30000001f1q1EAA",
  "listingName": "RevOps for Salesforce / Native CPQ / Quote to Cash / Subscription Billing / RLM",
  "publisher": "Kugamon",
  "rating": 2,
  "title": "Good Product, Challenges With Support",
  "text": "…",
  "reviewDate": "2017-02-23T18:04:11.000Z",
  "likeCount": 0,
  "reviewerIsSalesforceMVP": false,
  "commentCount": 1,
  "comments": [{ "date": "2017-02-24T09:12:00.000Z", "text": "…", "byReviewer": false }],
  "reviewUrl": "https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000001f1q1EAA&tab=r",
  "isNewReview": true
}
```

Every review row also has `topics` — the complaint / request themes found in it (e.g. `["customer support", "billing & contract"]`).

#### Review insights rows (`includeReviewInsights`)

Real numbers from a test run (`"keywords": ["e-signature"], "minReviews": 50, "includeReviewInsights": true, "maxReviewsPerListing": 150`, trimmed):

```json
{
  "recordType": "review-insights",
  "listingName": "Docusign eSignature for Salesforce",
  "reviewsAnalyzed": 150,
  "averageRating": 2.59,
  "negativeSharePct": 56,
  "topIssues": [
    { "theme": "bugs & errors", "mentions": 36, "examples": [{ "rating": 1, "title": "…", "text": "…" }] },
    { "theme": "customer support", "mentions": 36 },
    { "theme": "setup & implementation", "mentions": 27 },
    { "theme": "salesforce integration & sync", "mentions": 24 }
  ],
  "topPraise": [{ "theme": "time saved & productivity", "mentions": 8 }, { "theme": "easy to use", "mentions": 7 }],
  "featureRequests": { "mentions": 11 },
  "topPhrases": [{ "phrase": "docusign support", "reviews": 7 }, { "phrase": "customer service", "reviews": 4 }],
  "byYear": [{ "year": "2024", "reviews": 9, "averageRating": 1.67 }, { "year": "2025", "reviews": 3, "averageRating": 2.33 }],
  "ratingTrend": { "last12MonthsReviews": 3, "direction": null },
  "discussion": { "replyRatePct": 46, "negativeReplyRatePct": 61.9 }
}
```

The `review-comparison` row of the same run: Docusign weak in bugs & errors, customer support, integration & sync, setup and pricing; S-Docs (4.91★) gets far more praise for support, ease of use and time saved; Adobe Acrobat Sign (4.04★) has fewer integration, pricing and usability complaints and more "reliable" / "fast implementation" praise than its peers. Also saved as the `REVIEW_COMPARISON` record.

#### Market report rows (`includeMarketReport` / `marketReportOnly`)

Real numbers from a test run (top 60 strict matches for "cpq", details on, trimmed):

```json
{
  "recordType": "market-report",
  "query": "search:cpq",
  "totalOnAppExchange": 513,
  "listingsAnalyzed": 58,
  "publishers": 51,
  "averageRating": 4.75,
  "reviewWeightedRating": 4.82,
  "ratingDistribution": { "4.5-5": 31, "4.0-4.4": 5, "3.0-3.9": 1, "below 3": 1, "unrated": 20 },
  "totalReviews": 1060,
  "listingsWithoutReviewsPct": 34.5,
  "top10ReviewSharePct": 86.6,
  "topPublishersByReviews": [{ "publisher": "Conga", "listings": 1, "reviews": 285, "reviewSharePct": 26.9 }, { "publisher": "PandaDoc", "listings": 1, "reviews": 175, "reviewSharePct": 16.5 }, "…"],
  "listingTypes": [{ "value": "force/package", "count": 51, "pct": 87.9 }, "…"],
  "pricingModels": [{ "value": "paid", "count": 34, "pct": 58.6 }, { "value": "free", "count": 14, "pct": 24.1 }, "…"],
  "freeTrialSharePct": 22.4,
  "priceUsdPerUserMonth": { "listings": 26, "min": 8, "p25": 27.5, "median": 45, "p75": 82.5, "max": 150 },
  "newListingsLast365Days": 4,
  "medianListingAgeYears": 5.2,
  "releasedLast90DaysPct": 19.4,
  "notReleasedIn2YearsPct": 30.6,
  "publisherCountries": [{ "value": "United States", "count": 37, "pct": 63.8 }, { "value": "United Kingdom", "count": 7, "pct": 12.1 }, "…"],
  "topListings": [{ "name": "Conga Advantage CPQ (Configure Price Quote)", "publisher": "Conga", "rating": 4.95, "reviewCount": 285 }, "…"]
}
```

Pricing, freshness and country fields need details (`includeDetails`). `priceUsdPerUserMonth` uses only plans priced per user per month in USD, so different units are never mixed. All reports are also saved to the `MARKET_REPORT` key-value record.

#### Publisher rows (`outputLevel: "publishers"`)

```json
{
  "recordType": "publisher",
  "publisher": "Kugamon",
  "website": "http://www.kugamon.com",
  "websiteDomain": "kugamon.com",
  "headquarters": "San Francisco, CA",
  "founded": 2009,
  "listingCount": 2,
  "portfolioComplete": true,
  "totalReviews": 161,
  "averageRating": 4.92,
  "topListing": "RevOps for Salesforce / Lightning CPQ / Quote to Cash / Subscription Billing",
  "categories": ["contractManagement", "quotesAndOrders", "productivity"],
  "pricingModels": ["paid", "free"],
  "minPaidPriceFrom": 65,
  "hasFreeTrial": false,
  "latestReleaseDate": "2026-08-26T18:10:03.000Z",
  "lastSecurityReview": "2023-10-06",
  "listings": [{ "id": "a0N30000001f1q1EAA", "name": "RevOps for Salesforce / …", "rating": 4.92, "reviewCount": 134, "priceFrom": 65 }, "…"],
  "changeTypes": ["new-listing", "reviews-up"],
  "newListings": ["…"]
}
```

Example: every CPQ vendor with its whole portfolio, as a daily vendor monitor:

```json
{
  "keywords": ["cpq"],
  "maxResultsPerQuery": 100,
  "outputLevel": "publishers",
  "outputMode": "changed",
  "stateKey": "cpq-vendors"
}
```

Listing rows have `recordType: "listing"`. Use the **Reviews** dataset view, or filter by `recordType` when exporting.

Detail fields (`tagline` … `publisherFounded`, plus `pricingPlans`, `pricingNotes`, `highlights`, `industries`, `productsSupported`, `isSalesforceShield`, `namespacePrefix`…) appear only with `includeDetails`. Change fields appear when `outputMode` is `new` / `changed` or `trackChanges` is on. A run summary is saved to the `SUMMARY` record in the key-value store.

### Pricing

Pay per result, no subscription:

- **$2 per 1,000 listings** returned.
- **+$3 per 1,000 listings** when `includeDetails` is on (one extra request per listing).
- **$0.02 per market report row** (`includeMarketReport` / `marketReportOnly`). In report-only mode listings are not charged as rows; details, when loaded, are $3 per 1,000. A CPQ report over 60 apps with details ≈ $0.20, without details $0.02.
- **$1 per 1,000 reviews** when `includeReviews` is on.
- **$0.01 per review insights row** (`includeReviewInsights`; one per listing + one comparison row). Reviews read only for insights are not charged: 3 competitors × 150 reviews ≈ $0.04.
- **Publisher level:** $2 per 1,000 publisher rows + $3 per 1,000 listings in their portfolios (details are loaded for each). 15 CPQ vendors with 95 listings ≈ $0.32.

A full category snapshot of ~200 apps costs about $0.40. In `new` / `changed` mode you pay only for listings that are new or changed, so a daily monitor usually costs cents per month.

### Scheduling a monitor

1. Set `outputMode` to `changed` (or `new`) and give the monitor a `stateKey`.
2. Run it once. The first run is the baseline and returns everything.
3. Create an Apify Schedule (e.g. daily). Later runs return only what changed. Connect a webhook, Slack or email integration to get alerts.

### FAQ

**Can I get all reviews of an app?** Yes — set `includeReviews: true` and `maxReviewsPerListing` up to 5,000 (newest first). Use `reviewsSince` for a date range.

**How do I get only negative reviews of competitors?** `"keywords": ["cpq"], "includeReviews": true, "maxReviewRating": 2` returns only 1–2★ reviews of the matching apps.

**How do new-review alerts work?** With `outputMode: "new"` or `"changed"` and a `stateKey`, the first run is the baseline; later runs output only listings that are new/changed **and** every review posted since the previous run (even for listings that did not change otherwise).

**How are review themes detected? Is it AI?** No — keyword rules tuned on AppExchange reviews, so results are reproducible and cheap. Complaints are counted in 1–3★ reviews, praise in 4–5★ reviews, feature requests in all. Compare apps with the same `maxReviewsPerListing` so the per-100-review rates are comparable.

**Why is `ratingTrend.direction` often empty?** AppExchange apps get far fewer reviews than mobile apps. The trend needs at least 5 reviews in the last 12 months and 5 older ones in the sample; otherwise it stays `null` — use `byYear` instead.

**Can I get one row per vendor instead of per app?** Yes. Set `outputLevel: "publishers"`. Each vendor row includes website domain, HQ, founded year, employee count (when listed), all their AppExchange listings (`listings[]`), total reviews, weighted average rating and pricing models. `maxListingsPerPublisher` caps very large portfolios; `portfolioComplete: false` tells you when it was hit.

**How are a vendor's other listings found?** The Actor searches AppExchange for the publisher's name and keeps listings with exactly that publisher. Listings seen in an earlier run but missing from search are re-checked by ID, so `listing-removed` alerts fire only when a listing is really gone.

**How is the publisher country worked out?** AppExchange HQ is free text. The Actor reads country names, US states and abbreviations ("Houston, TX"), Canadian provinces and ~250 major cities ("Munich" → Germany) into `publisherCountry`. Unknown or empty HQs stay `null` (about 7% in our tests) and never match an `hqCountries` filter.

**Can I size a category without paying for every listing?** Yes: `marketReportOnly: true` returns one row per keyword/category. Without details it costs $0.02 per report; add `includeDetails` for pricing, freshness and HQ-country sections.

**Do you export reviewer names or publisher emails?** No. Reviews include only whether the reviewer is a Salesforce MVP / top contributor; publisher contact emails and phones are not exported.

### More tools from the same developer

- [Microsoft Marketplace & AppSource Offers Tracker](https://apify.com/signalscope-data/microsoft-marketplace-tracker) — 28k Azure Marketplace & AppSource offers with plans, free trial / PAYG flags and new/changed/removed alerts.
- [Google Workspace Marketplace Scraper & App Tracker](https://apify.com/signalscope-data/workspace-marketplace-tracker) — Gmail, Docs & Sheets add-ons with exact installs, OAuth permissions and new/changed alerts.
- [Atlassian, Zoom & Zendesk Marketplace Apps Tracker](https://apify.com/signalscope-data/saas-marketplaces-tracker) — apps from three SaaS integration marketplaces in one schema: installs, ratings, pricing, versions and change alerts.
- [Chrome, Firefox & VS Code Extensions Tracker](https://apify.com/signalscope-data/extension-marketplaces-tracker) — installs, ratings, versions and change alerts across three extension marketplaces.
- [App Store & Google Play Top Charts & App Rank Tracker](https://apify.com/signalscope-data/app-charts-tracker) — top free/paid/grossing charts in any country, with daily rank changes.
- [App Store & Google Play Reviews Scraper](https://apify.com/signalscope-data/app-reviews-scraper) — reviews, ratings and new-review monitoring for any app.
- [Company Jobs Scraper](https://apify.com/signalscope-data/ats-jobs-scraper) — every open job from Workday, Greenhouse, Lever, Ashby & more, with new-job alerts.
- [Shopify Products Scraper & Price Change Monitor](https://apify.com/signalscope-data/shopify-store-monitor) — full catalogs plus price-drop / restock alerts.

# Actor input Schema

## `keywords` (type: `array`):

Keywords to search on AppExchange, e.g. "cpq", "e-signature", "data backup", "ai agent". Each keyword is a separate ranked list. Combine with categories to search inside a category.

## `strictSearch` (type: `boolean`):

AppExchange search is semantic and also returns loosely related apps (even for nonsense queries). Keep only listings whose name, description, publisher or categories contain every keyword. rank still shows the position on AppExchange.

## `categories` (type: `array`):

AppExchange category slugs. Without keywords the whole category is listed (up to max results). Top level: sales, customerService, marketing, productivity, itAndAdministration, analytics, finance, commerce, integration, humanResources, collaboration. Sub-categories: quotesAndOrders, contractManagement, documentGeneration, dataCleansing, telephony, fieldService, salesIntelligence, accounting, projectManagement, marketingAutomation, surveys, etc.

## `publishers` (type: `array`):

Keep only listings whose publisher name contains one of these, e.g. "Conga", "DocuSign". Used alone, the Actor searches each publisher name and returns that vendor's listings.

## `listingIds` (type: `array`):

Track exact listings by AppExchange listing ID (e.g. "a0N30000001f1q1EAA") or full listing URL (https://appexchange.salesforce.com/appxListingDetail?listingId=...).

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

Ranking used for each list. The rank field and rank-change tracking follow this order.

## `maxResultsPerQuery` (type: `integer`):

Max listings per keyword / category list. A whole category (e.g. sales, ~1,700 apps) fits in one query.

## `outputLevel` (type: `string`):

"publishers" outputs one row per AppExchange publisher (ISV): website and domain, headquarters, founded year, employees, number of listings, total reviews, weighted average rating, categories, industries, pricing models, latest release, last security review and a full listings\[] portfolio (each publisher's other listings are added automatically). Listing details are loaded for every listing (charged as listing details). No emails or phone numbers. Monitor modes report new publishers, new listings and review growth.

## `maxListingsPerPublisher` (type: `integer`):

Publisher level only: cap on listings per publisher (matched listings + the rest of its portfolio, most popular first). Each listing is charged as listing details. Rows where the cap was hit have portfolioComplete: false. Salesforce Labs alone has 270+ listings.

## `includeDetails` (type: `boolean`):

Fetch each listing's detail page data: pricing plans and starting price, published date, latest package version and release date, security review date, editions, required products, industries, highlights, and publisher HQ / founded year / website. Charged as an extra event per listing.

## `includeReviews` (type: `boolean`):

Also output each listing's AppExchange user reviews as separate rows (recordType "review"): rating, title, text, date, likes, project details (edition, users, implementation) and comment thread. Reviewer names are not exported. In "new"/"changed" output mode, later runs output only reviews posted since the previous run. Charged per review.

## `maxReviewsPerListing` (type: `integer`):

Newest reviews first. Popular apps have 1,000+ reviews. Also the sample size for review insights.

## `reviewsSince` (type: `string`):

Optional date (YYYY-MM-DD). Only reviews posted on or after this date are output.

## `maxReviewRating` (type: `integer`):

Output only reviews with at most this many stars, e.g. 2 = critical reviews only (competitor weak spots). 5 = all reviews.

## `includeReviewInsights` (type: `boolean`):

Add one recordType "review-insights" row per listing, built from its newest reviews (up to "Max reviews per listing", respects "Reviews since"): rating distribution, negative/positive share, rating trend (last 12 months vs older), top complaint themes in 1-3 star reviews (bugs, setup & implementation, integration & sync, limits & performance, upgrades, support, pricing & licensing, contract & renewal, usability, documentation, data quality, permissions) with example quotes, top praise themes in 4-5 star reviews (support, ease of use, fast implementation, time saved, flexibility, reliability, native to Salesforce, value), feature requests, frequent phrases, reviews per year and reply rate. With 2+ listings (10+ reviews each) a "review-comparison" row benchmarks them: issue and praise matrix per 100 reviews, relative weaknesses and strengths. Rule-based (no AI), $0.01 per row. Works without "Include reviews" (reviews read for insights are not charged). Tip: raise "Max reviews per listing" to 100-200.

## `listingTypes` (type: `array`):

Optional filter by technology prefix, e.g. "force/package" (managed packages), "force/copilot" (Agentforce agents), "force/flow", "force/lightning", "salesforce-platform/api", "marketing-cloud", "tableau".

## `minReviews` (type: `integer`):

Skip listings with fewer reviews than this.

## `minRating` (type: `integer`):

Skip listings rated below this (0 = no filter). Unrated listings are skipped when set.

## `hqCountries` (type: `array`):

Keep only listings whose publisher is headquartered in one of these countries, e.g. "United States", "UK", "Germany", "India". AppExchange HQ is free text ("San Francisco, CA", "Munich"), so the Actor maps it to a country (publisherCountry field) from country names, US states/abbreviations, Canadian provinces and major cities. Other values match the raw HQ text (e.g. "Texas"). Loads listing details (charged as listing details).

## `pricingModels` (type: `array`):

Keep only these pricing models: free, freemium, paid, free_to_install ("free" also includes free_to_install). Loads listing details (charged as listing details).

## `includeMarketReport` (type: `boolean`):

Add one recordType "market-report" row per keyword/category: listings and publishers count, average and review-weighted rating, rating distribution, review concentration (top listing / top 10 share), listing types, categories, top publishers by listings and by reviews, Agentforce/MCP counts and top listings. With details: pricing model mix, paid / free-trial share, median price per user per month (USD), new listings in the last 90/365 days, release freshness, security review recency, publisher HQ countries and industries. Also saved to the MARKET_REPORT record.

## `marketReportOnly` (type: `boolean`):

Output only the market report rows (listings are analysed but not output or charged as listings). Turn on "Include details" for the pricing / freshness / HQ sections; loaded details are charged as listing details. outputMode and reviews are ignored.

## `outputMode` (type: `string`):

"new" and "changed" compare with the previous run of the same monitor name. The first run is the baseline and outputs everything.

## `trackChanges` (type: `boolean`):

Save a snapshot and add previousReviewCount, reviewsChange, previousRating, rankChange and changeTypes even when outputting all results.

## `minReviewsChange` (type: `integer`):

A reviews-up change is reported when a listing gained at least this many reviews since the last run.

## `minRankChange` (type: `integer`):

A rank-up / rank-down change is reported when the position moved at least this many places.

## `stateKey` (type: `string`):

Snapshot name used for change tracking. Use a different name for each separate monitor/schedule.

## Actor input object example

```json
{
  "keywords": [
    "cpq"
  ],
  "strictSearch": true,
  "sortBy": "relevance",
  "maxResultsPerQuery": 100,
  "outputLevel": "listings",
  "maxListingsPerPublisher": 50,
  "includeDetails": false,
  "includeReviews": false,
  "maxReviewsPerListing": 20,
  "maxReviewRating": 5,
  "includeReviewInsights": false,
  "minReviews": 0,
  "minRating": 0,
  "includeMarketReport": false,
  "marketReportOnly": false,
  "outputMode": "all",
  "trackChanges": false,
  "minReviewsChange": 1,
  "minRankChange": 5,
  "stateKey": "default"
}
```

# 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 = {
    "keywords": [
        "cpq"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/appexchange-tracker").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 = { "keywords": ["cpq"] }

# Run the Actor and wait for it to finish
run = client.actor("signalscope-data/appexchange-tracker").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 '{
  "keywords": [
    "cpq"
  ]
}' |
apify call signalscope-data/appexchange-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalscope-data/appexchange-tracker"
        }
    }
}
```

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/iTtYLKUfPQXodSfae/builds/rkHI1fOpMKP00CGBY/openapi.json
