<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CleanScrape</title>
    <description>The latest articles on DEV Community by CleanScrape (@cleanscrape).</description>
    <link>https://dev.to/cleanscrape</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126565%2F7f3a2bef-43ea-47db-a8a6-f8923b4ae916.png</url>
      <title>DEV Community: CleanScrape</title>
      <link>https://dev.to/cleanscrape</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cleanscrape"/>
    <language>en</language>
    <item>
      <title>Export App Store and Google Play reviews into one spreadsheet</title>
      <dc:creator>CleanScrape</dc:creator>
      <pubDate>Tue, 15 Sep 2026 15:45:58 +0000</pubDate>
      <link>https://dev.to/cleanscrape/export-app-store-and-google-play-reviews-into-one-spreadsheet-1c1l</link>
      <guid>https://dev.to/cleanscrape/export-app-store-and-google-play-reviews-into-one-spreadsheet-1c1l</guid>
      <description>&lt;p&gt;I'm building CleanScrape, a small collection of data tools on Apify. One of them collects App Store and Google Play reviews into the same dataset. I want the export to be useful without making people rename columns or work out which store each row came from.&lt;/p&gt;

&lt;p&gt;For this first walkthrough, I'll use Spotify and keep the request small: up to 20 reviews from each store, then a spreadsheet you can filter yourself. This uses my paid &lt;a href="https://apify.com/cleanscrape/app-store-reviews-scraper" rel="noopener noreferrer"&gt;App Store and Google Play Reviews Scraper&lt;/a&gt;. You do not need to write code to follow it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a small export
&lt;/h2&gt;

&lt;p&gt;You need an Apify account, an Android package name and a numeric Apple app ID. For this example, use Spotify:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;App identifier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;&lt;code&gt;com.spotify.music&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Store&lt;/td&gt;
&lt;td&gt;&lt;code&gt;324684580&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Open the Actor and use these inputs. You can enter them in the form or switch to JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"store"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"both"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"googlePlayAppId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.spotify.music"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"appStoreId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"324684580"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxReviews"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"newest"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The limit is &lt;strong&gt;per store&lt;/strong&gt;. This request can return up to 40 reviews, not 20 in total. It may return fewer if the source does not provide enough reviews.&lt;/p&gt;

&lt;p&gt;Check the Pricing tab and set a run spending limit before starting. After the run finishes, open Output to see the rows. Also open &lt;code&gt;RUN_REPORT&lt;/code&gt; in the run's key-value store: it reports the outcome for each store separately. A successful run can still contain partial results from one source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download and use the spreadsheet
&lt;/h2&gt;

&lt;p&gt;Export the dataset as CSV or Excel. Both stores use the same field names, including &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;appId&lt;/code&gt;, &lt;code&gt;reviewId&lt;/code&gt;, &lt;code&gt;rating&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt; and &lt;code&gt;appVersion&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I'd start by filtering &lt;code&gt;rating&lt;/code&gt; to 1 or 2 and reading those reviews. Keep the &lt;code&gt;source&lt;/code&gt; column visible so you know which store each row came from. Then filter by &lt;code&gt;appVersion&lt;/code&gt; if you want to inspect feedback associated with a release.&lt;/p&gt;

&lt;p&gt;That is a reading filter, not sentiment analysis. The rating helps you choose where to look; the review text tells you what someone is actually unhappy about.&lt;/p&gt;

&lt;p&gt;Some fields will be empty. Apple review titles are available where supplied; Google Play titles are null. Developer replies are included for Google Play when available, not for Apple. Missing app versions remain null rather than being filled with the current release. I would rather leave an unknown value visible than make the spreadsheet look more complete than the source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the first run costs
&lt;/h2&gt;

&lt;p&gt;At the base rate, 40 delivered reviews cost $0.008 in result charges. Startup adds $0.01 per allocated GB, with a minimum of one startup event. With the current 4 GB default, that makes &lt;strong&gt;$0.048 for a run returning 40 reviews&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Startup charges also apply if no reviews come back. Eligible Apify subscription tiers receive discounts. These figures describe the pricing on 15 September 2026; check the Actor's &lt;a href="https://apify.com/cleanscrape/app-store-reviews-scraper/pricing" rel="noopener noreferrer"&gt;Pricing tab&lt;/a&gt; before running it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few limits I want to be clear about
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apple coverage is recent, not exhaustive.&lt;/strong&gt; This tool uses Apple's public review feed, which is limited to ten recent pages per app and storefront, commonly around 500 reviews. Increasing the requested limit cannot turn it into a complete historical archive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dates have source-specific meanings.&lt;/strong&gt; The Apple date is the review-level update time exposed by the feed, not a guaranteed original publication date. Google Play uses its review timestamp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A requested country is not the reviewer's verified location.&lt;/strong&gt; Keep that distinction if you compare markets. A bounded recent sample is also not enough to estimate an app's overall customer satisfaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run it again next week
&lt;/h2&gt;

&lt;p&gt;The Actor does not maintain review history across runs. For a recurring import, use &lt;code&gt;(source, appId, country, reviewId)&lt;/code&gt; as a starting key when a review ID exists. Update edited reviews instead of blindly appending another copy, and handle missing IDs separately.&lt;/p&gt;

&lt;p&gt;You can start with the JSON above or choose a preset under Tasks on the &lt;a href="https://apify.com/cleanscrape/app-store-reviews-scraper" rel="noopener noreferrer"&gt;Actor page&lt;/a&gt;. No store login or personal cookies are required. CleanScrape is independent of Apple, Google and Spotify.&lt;/p&gt;

&lt;p&gt;I'm interested in how people use these exports beyond the first download. Are you checking feedback after a release, comparing apps, or feeding reviews into another tool? That context is useful when deciding what to improve next.&lt;/p&gt;

&lt;p&gt;For a bug, please open an Actor issue with the run ID and a non-sensitive input example. Keep API tokens and credentials out of comments.&lt;/p&gt;

</description>
      <category>webscraping</category>
    </item>
    <item>
      <title>Compare Google Trends terms in a spreadsheet without confusing interest with search volume</title>
      <dc:creator>CleanScrape</dc:creator>
      <pubDate>Tue, 15 Sep 2026 15:44:55 +0000</pubDate>
      <link>https://dev.to/cleanscrape/compare-google-trends-terms-in-a-spreadsheet-without-confusing-interest-with-search-volume-4lmm</link>
      <guid>https://dev.to/cleanscrape/compare-google-trends-terms-in-a-spreadsheet-without-confusing-interest-with-search-volume-4lmm</guid>
      <description>&lt;p&gt;I'm building CleanScrape for people who want to use web data in their own reports and tools. The &lt;a href="https://apify.com/cleanscrape/google-trends-scraper" rel="noopener noreferrer"&gt;Google Trends Scraper&lt;/a&gt; is one part of that: it returns Trends observations as rows you can export or retrieve through the API.&lt;/p&gt;

&lt;p&gt;For this post, I'll compare ChatGPT and Claude in a spreadsheet. There is one detail I want to get out of the way first: a Trends value of 100 does not mean 100 searches. It is a relative interest score within the requested comparison. That meaning needs to survive the CSV export.&lt;/p&gt;

&lt;p&gt;This walkthrough uses my paid Actor on Apify. I've included the cost calculation below so you can judge whether it fits your use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request both terms together
&lt;/h2&gt;

&lt;p&gt;This example compares ChatGPT and Claude in the US over the past three months. Open the Actor, switch to JSON input and enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"searchTerms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ChatGPT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Claude"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"interest_over_time"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"geo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeframe"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"today 3-m"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need an Apify account, but no Google login. The Actor uses residential Apify Proxy by default for these requests. It accesses Google Trends website endpoints; it is not Google's official API or an affiliated Google product.&lt;/p&gt;

&lt;p&gt;I recommend starting with just the timeline. It keeps the output easier to read and avoids paying for result types you are not using yet.&lt;/p&gt;

&lt;p&gt;Keep both terms in the same request. Pulling each term independently can give you separately normalized series that are not directly comparable. Also note that these inputs are search terms, not a guarantee that every search relates to a particular company or product.&lt;/p&gt;

&lt;p&gt;Set a run spending limit and check the current pricing before selecting Start. You can also find this comparison as an example task on the Actor page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn the rows into a chart
&lt;/h2&gt;

&lt;p&gt;Once the run finishes, open Output and export CSV or Excel. Timeline rows include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;How to use it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keyword&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Separate the two series&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Human-readable source date label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unix timestamp in seconds, returned as a string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Relative search interest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isPartial&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Whether Google marks the interval as partial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In your spreadsheet, create a pivot table with date as the rows, keyword as the columns and value as the measure. Sort chronologically; if the imported date labels sort as text, convert them to dates or sort by the numeric timestamp first. Insert a line chart from that table.&lt;/p&gt;

&lt;p&gt;Use the pivot only on the timeline rows. If you later request related queries or regional data, filter by &lt;code&gt;dataType&lt;/code&gt; first. Those rows have different meanings.&lt;/p&gt;

&lt;p&gt;The Actor exports data, not a finished chart. You choose the chart, title and interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the report before trusting the chart
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;RUN_REPORT&lt;/code&gt; in the run's key-value store. Each requested feature has its own status and row count. An empty result is not evidence that nobody searched for the term; a failed request is not a zero.&lt;/p&gt;

&lt;p&gt;Google chooses the returned time intervals. Three months does not guarantee exactly 90 observations. A zero can reflect insufficient data, and a partial interval should not be presented as a completed period without qualification.&lt;/p&gt;

&lt;p&gt;I would describe the chart as a comparison of relative search interest, not as a comparison of sales, active users or market share. The export cannot establish those things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Count rows when estimating the cost
&lt;/h2&gt;

&lt;p&gt;Each keyword at each returned timestamp is one billable row. If Google returns 90 timestamps for two terms, that is 180 rows.&lt;/p&gt;

&lt;p&gt;At the base rate of $0.003 per row, those rows cost $0.54. Startup adds $0.05 per allocated GB, with a minimum of one startup event. With the current 4 GB default, the total for that example is &lt;strong&gt;$0.74&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is a calculation, not a promised row count. Startup is charged even when no rows are returned, and other selected data types add their own rows. Subscription discounts can reduce the rates. Pricing is stated as of 15 September 2026; use the &lt;a href="https://apify.com/cleanscrape/google-trends-scraper/pricing" rel="noopener noreferrer"&gt;Pricing tab&lt;/a&gt; for current figures.&lt;/p&gt;

&lt;p&gt;If you are comparing tools, check the cost for the same task. One service may call an entire keyword history a result; another may count each observation. I do not want the per-result headline to obscure that difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try your own comparison
&lt;/h2&gt;

&lt;p&gt;Replace the two terms with a comparison relevant to your work, keeping the geography and time window consistent. Save the input alongside the export so you can explain what the chart measures later.&lt;/p&gt;

&lt;p&gt;The Actor also supports related queries, regional interest and a current trending-searches feed. Related topics are optional and availability-limited: Google may return no topics even for familiar terms. I would not make a reporting workflow depend on that field always being populated.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/cleanscrape/google-trends-scraper" rel="noopener noreferrer"&gt;full documentation and example tasks&lt;/a&gt; are on Apify. I'd be interested to hear what you need after the export: a weekly comparison, a dashboard, or simply a file you can inspect. It helps me understand where the tool is useful and where the next bit of friction is.&lt;/p&gt;

</description>
      <category>webscraping</category>
    </item>
    <item>
      <title>Track "Map Your Show" exhibitor changes without comparing spreadsheets by hand</title>
      <dc:creator>CleanScrape</dc:creator>
      <pubDate>Tue, 15 Sep 2026 15:43:37 +0000</pubDate>
      <link>https://dev.to/cleanscrape/track-map-your-show-exhibitor-changes-without-comparing-spreadsheets-by-hand-2ff5</link>
      <guid>https://dev.to/cleanscrape/track-map-your-show-exhibitor-changes-without-comparing-spreadsheets-by-hand-2ff5</guid>
      <description>&lt;p&gt;I'm building CleanScrape as a small collection of practical data tools. With the &lt;a href="https://apify.com/cleanscrape/event-exhibitor-monitor" rel="noopener noreferrer"&gt;Event Exhibitor Scraper and Change Monitor&lt;/a&gt;, I want to make one fairly specific task easier: export an exhibitor list, then see what changed without comparing the next spreadsheet by hand.&lt;/p&gt;

&lt;p&gt;A new company, a different booth or an updated description can be useful information when you are planning an event visit or researching suppliers. But I do not want an incomplete download to look like dozens of companies disappearing. That is why the monitoring checks matter as much as the export.&lt;/p&gt;

&lt;p&gt;I'll show a small snapshot first, then how to keep a baseline for later comparisons. This is a paid Actor on Apify. Its scope is public "Map Your Show" &lt;code&gt;8_0&lt;/code&gt; directories on &lt;code&gt;EVENT.mapyourshow.com&lt;/code&gt;, not every conference website. It does not provide attendee or hidden contact data.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, export a small list
&lt;/h2&gt;

&lt;p&gt;Open the Actor in Apify and use this input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://iaapaexpo26.mapyourshow.com/8_0/explore/exhibitor-alphalist.cfm"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"snapshot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxExhibitorsPerEvent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeDetails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review the Pricing tab and set a run spending limit before starting. This requests up to 100 exhibitors, with optional profile enrichment switched off. The IAAPA example depends on that edition's directory remaining public.&lt;/p&gt;

&lt;p&gt;After the run finishes, open Output and export CSV or Excel. Rows include company names, booths, listing descriptions and source links where available. Booths are arrays in the JSON because an exhibitor can have more than one.&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;SUMMARY&lt;/code&gt; in the run's key-value store as well. A &lt;code&gt;capped_snapshot&lt;/code&gt; is a deliberately limited sample, not a claim that you collected the entire directory. With optional details off, website and location fields can be null.&lt;/p&gt;

&lt;p&gt;At the base rate, a snapshot returning 100 records costs &lt;strong&gt;$0.20&lt;/strong&gt;, with no startup fee. I recommend starting here so you can see whether the fields are useful before setting up a recurring check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a baseline when you need comparisons
&lt;/h2&gt;

&lt;p&gt;For monitoring, use a stable watchlist name and a source-record limit large enough for the whole directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://iaapaexpo26.mapyourshow.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"monitor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"watchlistName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iaapa-research-2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxExhibitorsPerEvent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeDetails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not another 100-row sample. The first complete monitoring run exports the baseline, and those rows are billable. A directory with 1,000 exhibitors costs $2.05 at the base rate for that first check, without optional details. A larger baseline costs more.&lt;/p&gt;

&lt;p&gt;The Actor needs permission to create and access its named watchlist storage in the run owner's account. Reuse the same watchlist name and settings on later runs. You can save an Apify Task and add a schedule, but the input alone does not create one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a later run tells you
&lt;/h2&gt;

&lt;p&gt;Later runs export changes rather than another copy of the baseline. Change records distinguish additions, updates and confirmed absence. For an update, &lt;code&gt;changedFields&lt;/code&gt; tells you what changed, and &lt;code&gt;before&lt;/code&gt; and &lt;code&gt;after&lt;/code&gt; hold the compared values.&lt;/p&gt;

&lt;p&gt;The following is an &lt;strong&gt;illustration&lt;/strong&gt;, not a report about a real exhibitor:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Previous booth&lt;/th&gt;
&lt;th&gt;Current booth&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Example Manufacturing&lt;/td&gt;
&lt;td&gt;B12&lt;/td&gt;
&lt;td&gt;C08&lt;/td&gt;
&lt;td&gt;Booth field changed between checks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An unchanged directory can correctly produce zero change rows. The completed monitoring check still costs $0.05 per directory at the base rate. A check returning ten changes costs $0.07 without optional details.&lt;/p&gt;

&lt;p&gt;Those prices are stated as of 15 September 2026, before subscription discounts. The &lt;a href="https://apify.com/cleanscrape/event-exhibitor-monitor/pricing" rel="noopener noreferrer"&gt;Pricing tab&lt;/a&gt; has current rates. Optional enrichment is separately charged when enabled and public details are extracted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I would not treat one missing result as a removal
&lt;/h2&gt;

&lt;p&gt;The monitor requires a complete scan that reconciles retrieved IDs with the directory's reported total. Failed requests, overlapping pages and incompatible source responses must not silently become a new baseline.&lt;/p&gt;

&lt;p&gt;A company is reported as &lt;code&gt;no_longer_listed&lt;/code&gt; only after two consecutive complete checks miss it. Even then, that means it was no longer observed in the directory, not that it definitely withdrew from the event.&lt;/p&gt;

&lt;p&gt;There is an additional guard against sudden mass disappearance: when a baseline has at least ten exhibitors and more than 40% disappear at once, the check is quarantined rather than advancing the baseline. Empty source directories are treated as unavailable.&lt;/p&gt;

&lt;p&gt;I prefer that cautious behavior to a convincing-looking list of removals based on a failed fetch. It still has limits: the website can change between requests, and a change that happens and reverts between runs can go unseen. These checks do not make the snapshot perfectly atomic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before adding notifications
&lt;/h2&gt;

&lt;p&gt;Run the workflow manually first and inspect &lt;code&gt;SUMMARY&lt;/code&gt;. A run covering multiple events can have mixed outcomes. Monitoring supports at most 5,000 source records per event; optional details support at most 500 matched profiles per event.&lt;/p&gt;

&lt;p&gt;A retry after interrupted delivery can repeat records, so use &lt;code&gt;recordId&lt;/code&gt; for downstream deduplication. Do not assume exactly-once delivery. If you use keyword filters, a company leaving the matching scope is not necessarily leaving the directory.&lt;/p&gt;

&lt;p&gt;Email, Slack and CRM actions belong in a separate integration; the Actor does not send messages or contact exhibitors. Start with the &lt;a href="https://apify.com/cleanscrape/event-exhibitor-monitor" rel="noopener noreferrer"&gt;snapshot example&lt;/a&gt;, inspect the fields, and add monitoring only if you need it.&lt;/p&gt;

&lt;p&gt;CleanScrape is independent of Map Your Show and the event organizers. Public availability does not remove the need to respect source terms and data-use restrictions.&lt;/p&gt;

&lt;p&gt;I'd like to hear from people who actually work with exhibitor lists. Which changes affect your planning enough to be worth tracking: new companies, booth moves, updated descriptions, or something else?&lt;/p&gt;

</description>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
