<?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: Truffle Pig Data</title>
    <description>The latest articles on DEV Community by Truffle Pig Data (@trufflepig).</description>
    <link>https://dev.to/trufflepig</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%2F4032427%2Fd0090288-9c11-47e3-b5bc-5670ada11de5.png</url>
      <title>DEV Community: Truffle Pig Data</title>
      <link>https://dev.to/trufflepig</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trufflepig"/>
    <language>en</language>
    <item>
      <title>How to find investors for a startup in 2026 (with the cheque sizes attached)</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:25:47 +0000</pubDate>
      <link>https://dev.to/trufflepig/how-to-find-investors-for-a-startup-in-2026-with-the-cheque-sizes-attached-5d7g</link>
      <guid>https://dev.to/trufflepig/how-to-find-investors-for-a-startup-in-2026-with-the-cheque-sizes-attached-5d7g</guid>
      <description>&lt;p&gt;Every founder I know hits the same wall on a raise. You can find investor &lt;em&gt;names&lt;/em&gt; in an afternoon. What you cannot find, without a lot of tab-switching, is which of them writes a cheque the size of your round.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://signal.nfx.com" rel="noopener noreferrer"&gt;Signal by NFX&lt;/a&gt; publishes that. It maintains public investor lists organised by sector and stage, and each investor carries a cheque-size range. The lists are public, no login, but they paginate eight at a time through a private endpoint, so copying one into a spreadsheet by hand is a genuinely bad afternoon.&lt;/p&gt;

&lt;p&gt;I did it by hand once. Then I stopped doing it by hand.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the NFX Signal investor data actually contains
&lt;/h2&gt;

&lt;p&gt;The NFX Signal Investor API returns venture investors, VC firms, and the investor-list catalog as structured JSON, including the minimum, target, and maximum cheque each investor writes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Investor&lt;/td&gt;
&lt;td&gt;name, position, profile link, headshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheque size&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;minInvestment&lt;/code&gt;, &lt;code&gt;targetInvestment&lt;/code&gt;, &lt;code&gt;maxInvestment&lt;/code&gt; in USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firm&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;firmName&lt;/code&gt;, &lt;code&gt;firmUrl&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;investment locations, other lists they appear on, source list stage and sector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catalog&lt;/td&gt;
&lt;td&gt;349 lists across 103 sectors, four stages, and 14 geographies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The largest single list, &lt;code&gt;fintech-seed&lt;/code&gt;, holds 8,775 investors. &lt;code&gt;san-francisco-bay-area&lt;/code&gt; holds 8,246.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Founders raising, who need a target list ordered by the cheque they actually need.&lt;/li&gt;
&lt;li&gt;Anyone selling to VCs, who needs a firm directory for a CRM rather than individual partners.&lt;/li&gt;
&lt;li&gt;Analysts mapping a market, who want to see which firms show up across AI, FinTech, and climate lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The DIY path, and where it breaks
&lt;/h2&gt;

&lt;p&gt;You can do this by hand. Open a list page, copy the eight visible investors, click load more, repeat. For a 300-investor list that is roughly 38 rounds of clicking.&lt;/p&gt;

&lt;p&gt;Scripting it is not much better at first pass. The page is server rendered, so the first batch is in the HTML, but everything after that comes from a cursor-paginated endpoint that the page calls as you scroll. You end up reverse engineering the pagination, then handling the fact that cheque sizes come back as strings, that geography is modelled as a sector rather than a location field, and that a "firm" on a list is only a name and a link until you enrich it.&lt;/p&gt;

&lt;p&gt;None of that is hard. It is just a day you did not plan to spend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shortcut: run it as an API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Console.&lt;/strong&gt; Open the &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;NFX Signal Investor API&lt;/a&gt;, pick a mode, hit Start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST.&lt;/strong&gt; One call, no login to the source needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~nfx-signal-investor-api/run-sync-get-dataset-items"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"mode":"investors","listSlugs":["saas-seed"],"maxItems":50}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The run endpoint is documented in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP.&lt;/strong&gt; Point any MCP client at the server below and an agent can call it directly:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp.apify.com/?tools=actors,docs,johnvc/nfx-signal-investor-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That last one matters more than it looks. "Which seed investors back developer tools, and what do they write?" is a question an agent can now answer from live data instead of memory.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to find investors for a startup, by stage and cheque size
&lt;/h2&gt;

&lt;p&gt;The one I use most. Pick the lists that match your round, then sort by &lt;code&gt;targetInvestment&lt;/code&gt;:&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;"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;"investors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listSlugs"&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;"saas-seed"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&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="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;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;"result_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"investor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Brendan Wallace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"managing_partner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"minInvestment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targetInvestment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12500000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxInvestment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"firmName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fifth Wall Ventures"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"personUrl"&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://signal.nfx.com/investors/brendan-wallace"&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;Ready to run: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/find-investors-for-your-startup-by-stage-and-check-size?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find Investors for Your Startup by Stage and Check Size&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting a list of VC firms in San Francisco
&lt;/h2&gt;

&lt;p&gt;Switch to &lt;code&gt;firms&lt;/code&gt; mode and you get the firm directory instead of individual partners, which is the shape you want for a CRM import.&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;"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;"firms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listSlugs"&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;"san-francisco-bay-area"&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;Ready to run: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/list-of-vc-firms-in-san-francisco-bay-area?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;List of VC Firms in San Francisco Bay Area&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pre seed investors, with the cheque sizes attached
&lt;/h2&gt;

&lt;p&gt;Pre-seed is the stage where cheque size matters most and is published least consistently. Three sector lists in one run:&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;"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;"investors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listSlugs"&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;"fintech-pre-seed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"saas-pre-seed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai-pre-seed"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&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;Ready to run: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/pre-seed-investors-list-with-check-sizes?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Pre Seed Investors List With Check Sizes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using it as a Crunchbase alternative
&lt;/h2&gt;

&lt;p&gt;It complements those tools rather than replacing them, and the difference is worth being precise about. Crunchbase and PitchBook are company-centric: they tell you what a company raised. This is investor-centric: it tells you who invests, at what stage, and what they write. You can attach Crunchbase data per firm in the same run:&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;"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;"investors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listSlugs"&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;"ai-seed"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&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;"enrichWithCrunchbase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Ready to run: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/crunchbase-alternative-for-investor-and-vc-firm-data?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Crunchbase Alternative for Investor and VC Firm Data&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Browsing the whole VC database first
&lt;/h2&gt;

&lt;p&gt;Slugs are not guessable, so start here. &lt;code&gt;lists&lt;/code&gt; mode returns the catalog with a slug, stage, sector, and investor count for each of the 349 lists.&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;"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;"lists"&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;Ready to run: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/vc-database-export-by-sector-and-stage?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;VC Database Export by Sector and Stage&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exporting a Signal NFX list to JSON or CSV
&lt;/h2&gt;

&lt;p&gt;If you just want one list out of the browser and into a file, this is the plain version, no enrichment, no filtering: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/export-signal-nfx-investor-lists-to-json-or-csv?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Export Signal NFX Investor Lists to JSON or CSV&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tracking new investors entering your sector
&lt;/h2&gt;

&lt;p&gt;An export is a snapshot. Save the input as a Task, attach a monthly Schedule, and diff the runs to see who entered your sector: &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/track-new-investors-joining-a-vc-list-each-month?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Track New Investors Joining a VC List Each Month&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The example repo
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/johnisanerd" rel="noopener noreferrer"&gt;
        johnisanerd
      &lt;/a&gt; / &lt;a href="https://github.com/johnisanerd/Apify-NFX-Signal-Investor-API" rel="noopener noreferrer"&gt;
        Apify-NFX-Signal-Investor-API
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      NFX Signal Investor API examples: find investors, check sizes, and a list of VC firms from Signal by NFX as JSON. Python + MCP quick start.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NFX Signal Investor API: find investors, check sizes, and VC firms&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Python and MCP examples for the &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api?fpr=9n7kx3" rel="nofollow noopener noreferrer"&gt;NFX Signal Investor API&lt;/a&gt; on Apify. It turns &lt;a href="https://signal.nfx.com" rel="nofollow noopener noreferrer"&gt;Signal by NFX&lt;/a&gt; investor lists into structured JSON: venture investors, the VC firms behind them, and the check size each investor actually writes.&lt;/p&gt;

&lt;p&gt;Not affiliated with, endorsed by, or connected to NFX. It reads the same public investor lists any visitor can browse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=jREWahDGhJM" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4b1abe664c6900307628c8040c8939dfe65363a971a6d17d7473aae258d70132/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f6a52455761684447684a4d2f687164656661756c742e6a7067" alt="Watch the walkthrough"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Text walkthrough&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;If you have ever searched for how to find investors for a startup, the hard part is not finding names, it is finding the right names with the right cheque size. This API starts from the public Signal NFX investor lists: 349 of them, spanning 103 sectors and four stages from pre-seed to Series B. Run &lt;code&gt;mode: "lists"&lt;/code&gt; first and you get the whole catalog with a slug, a stage, a sector, and an investor count for each one. Pick…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/johnisanerd/Apify-NFX-Signal-Investor-API" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Python quick start with uv, five task-aligned helper functions, and MCP install walkthroughs for Claude Cowork, Claude Code, Claude on the web, Cursor, and ChatGPT.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping NFX Signal investor data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need an NFX account to use this scraper?
&lt;/h3&gt;

&lt;p&gt;No. It reads the public investor lists on signal.nfx.com, so no account, cookie, or token is needed for the source. You only need an Apify token to run the Actor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I build my own scraper for this instead?
&lt;/h3&gt;

&lt;p&gt;If you need one list once, scrape it yourself, it is a fair afternoon of work. The pagination, the stringified cheque amounts, and the firm enrichment chain are the parts that make it a maintenance job rather than a script.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use this scraper from Claude or another AI agent?
&lt;/h3&gt;

&lt;p&gt;Yes, over MCP. Point the client at the server URL above and the agent can discover the input schema and run it, which turns "who invests in my sector" into a live query.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule this scraper to run every month?
&lt;/h3&gt;

&lt;p&gt;Yes. Save your input as a Task, attach a Schedule, and diff each run. The &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api/examples/track-new-investors-joining-a-vc-list-each-month?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;monthly tracking example&lt;/a&gt; is set up for exactly that.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does this scraper not give me?
&lt;/h3&gt;

&lt;p&gt;Two honest limits. Not every investor publishes a cheque range, and those fields come back empty rather than estimated. And firm enrichment resolves by company name, so a firm with an ambiguous name may come back without LinkedIn or Crunchbase fields attached; you are not charged for the ones that miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;This Actor is catalogued on &lt;a href="https://www.alphaosint.com/sources/nfx-signal-investor-api/" rel="noopener noreferrer"&gt;Alpha OSINT&lt;/a&gt; alongside the rest of the financial and company data sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Run the &lt;a href="https://apify.com/johnvc/nfx-signal-investor-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;NFX Signal Investor API&lt;/a&gt; on a single list first, with &lt;code&gt;maxItems&lt;/code&gt; set low, and see whether the cheque sizes change how you build your list. That is the part I did not expect to matter as much as it does.&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Pull Remote Startup Jobs With Salary and Equity in 2026 (Python + a jobs API)</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:05:33 +0000</pubDate>
      <link>https://dev.to/trufflepig/how-to-pull-remote-startup-jobs-with-salary-and-equity-in-2026-python-a-jobs-api-53jn</link>
      <guid>https://dev.to/trufflepig/how-to-pull-remote-startup-jobs-with-salary-and-equity-in-2026-python-a-jobs-api-53jn</guid>
      <description>&lt;p&gt;Pulling remote startup jobs with real salary and equity numbers attached is harder than it should be. &lt;a href="https://wellfound.com" rel="noopener noreferrer"&gt;Wellfound&lt;/a&gt;, the site formerly known as AngelList Talent, is one of the few places where companies publish both right on the posting, which is why I went there to answer what sounded like a simple question: what does a seed-stage startup actually pay a backend engineer?&lt;/p&gt;

&lt;p&gt;Reading a few hundred postings by hand is not a research method. So here is the manual approach, where it falls over, and the jobs API I use instead.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What the API returns
&lt;/h2&gt;

&lt;p&gt;The Wellfound Jobs API returns startup job listings as structured JSON, with the posted compensation parsed into separate salary and equity numbers.&lt;/p&gt;

&lt;p&gt;Most job feeds hand you a string like &lt;code&gt;$135k - $165k * 0.05% - 0.15%&lt;/code&gt; and wish you luck. This one gives you that string &lt;em&gt;and&lt;/em&gt; the parsed numbers next to it:&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;compensationRaw&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$135k – $165k • 0.05% – 0.15%&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;exactly as posted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;salaryMin&lt;/code&gt; / &lt;code&gt;salaryMax&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;135000&lt;/code&gt; / &lt;code&gt;165000&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;parsed, &lt;code&gt;null&lt;/code&gt; when unpublished&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;equityMin&lt;/code&gt; / &lt;code&gt;equityMax&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.05&lt;/code&gt; / &lt;code&gt;0.15&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;percent, &lt;code&gt;null&lt;/code&gt; when unpublished&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;company.ycFunded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Y Combinator flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;company.stage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;early_stage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;funding stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;remoteKind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REMOTE_ONLY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;remote arrangement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;full markdown&lt;/td&gt;
&lt;td&gt;the whole posting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You also get &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;locationNames&lt;/code&gt;, &lt;code&gt;acceptedRemoteLocationNames&lt;/code&gt;, &lt;code&gt;jobType&lt;/code&gt;, &lt;code&gt;yearsExperienceMin&lt;/code&gt;/&lt;code&gt;Max&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt;, and a &lt;code&gt;company&lt;/code&gt; object with size, tagline, and the &lt;code&gt;topInvestors&lt;/code&gt; and &lt;code&gt;activelyHiring&lt;/code&gt; flags.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You are building a job board or an aggregator and want early-stage roles that the big feeds miss.&lt;/li&gt;
&lt;li&gt;You are weighing an offer and want a defensible comp range instead of a vibe.&lt;/li&gt;
&lt;li&gt;You are a founder setting a band and have nothing to compare against.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The DIY path, and where it breaks
&lt;/h2&gt;

&lt;p&gt;Wellfound is a Next.js app, so the listing data is sitting in the &lt;code&gt;__NEXT_DATA__&lt;/code&gt; blob rather than the HTML. You can get surprisingly far with &lt;code&gt;requests&lt;/code&gt; and a JSON walk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://wellfound.com/role/r/software-engineer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="n"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__NEXT_DATA__[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;apollo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;props&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pageProps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apolloState&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;apollo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__typename&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JobListingSearchResult&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jobs on page 1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Three things break this, in the order you hit them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The compensation is one string.&lt;/strong&gt; &lt;code&gt;$135k – $165k • 0.05% – 0.15%&lt;/code&gt; has to be split into four numbers, and the format varies. Salary only, equity only, hourly, "competitive".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role slugs are not free text.&lt;/strong&gt; &lt;code&gt;/role/software&lt;/code&gt; is a 404. Only &lt;code&gt;/role/software-engineer&lt;/code&gt; exists. You need the real slug list before you can query anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The page shapes differ.&lt;/strong&gt; The role pages use &lt;code&gt;JobListingSearchResult&lt;/code&gt;, but the site-wide feed uses a completely different typename with a different nesting. Parse one and the other silently returns nothing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of that is unsolvable. It is just a parser you now own forever.&lt;/p&gt;
&lt;h2&gt;
  
  
  The shortcut: run it as an API
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Wellfound Jobs API&lt;/a&gt; handles the parsing, the slug mapping, and both page shapes. Three ways in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Console.&lt;/strong&gt; Open the &lt;a href="https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Actor page&lt;/a&gt;, click Try for free, set a role, and run it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST.&lt;/strong&gt; Any HTTP client, using the &lt;a href="https://docs.apify.com/api/v2#/reference/actors/run-actor-synchronously-and-get-dataset-items" rel="noopener noreferrer"&gt;Apify run-sync endpoint&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~wellfound-jobs-api/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"roles":["software-engineer"],"remoteOnly":true,"maxItems":25}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;MCP.&lt;/strong&gt; It runs as a tool for Claude and other MCP clients. Point your config at:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp.apify.com/?tools=actors,docs,johnvc/wellfound-jobs-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then ask in plain language: "find remote startup jobs for a senior backend engineer paying over 160k, and tell me which companies are YC backed." Setup docs are in the &lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;Apify MCP guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Find remote startup jobs
&lt;/h2&gt;

&lt;p&gt;The one I reach for most. &lt;code&gt;remoteOnly&lt;/code&gt; filters to listings that actually accept remote applicants, and &lt;code&gt;acceptedRemoteLocationNames&lt;/code&gt; on each row tells you &lt;em&gt;where&lt;/em&gt; they accept them from, which is the part that usually disqualifies you.&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="nl"&gt;"roles"&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;"software-engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"remoteOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minSalary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&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;Ready to run: &lt;a href="https://apify.com/johnvc/wellfound-jobs-api/examples/remote-startup-jobs?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find Remote Startup Jobs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Find Y Combinator startup jobs
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ycOnly&lt;/code&gt; narrows to YC-backed companies, which is the filter I have not found anywhere else. Pair it with &lt;code&gt;companyStage&lt;/code&gt; so you are comparing seed against seed rather than seed against Series C.&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="nl"&gt;"roles"&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;"software-engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ycOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"includeDescription"&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;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150&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;Ready to run: &lt;a href="https://apify.com/johnvc/wellfound-jobs-api/examples/yc-startup-jobs?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find Y Combinator Startup Jobs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Startup jobs in San Francisco
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;locations&lt;/code&gt; takes city slugs and pairs with any role. Each role and city combination becomes its own search, so three roles across four cities is twelve searches, not seven. Watch &lt;code&gt;maxItems&lt;/code&gt; accordingly.&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="nl"&gt;"roles"&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;"product-manager"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locations"&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;"san-francisco"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&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;Ready to run: &lt;a href="https://apify.com/johnvc/wellfound-jobs-api/examples/startup-jobs-san-francisco?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find Startup Jobs in San Francisco&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Startup jobs in New York
&lt;/h2&gt;

&lt;p&gt;Same shape, different slug. Worth running separately rather than together, because the comp distributions are genuinely different and averaging across cities hides that.&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="nl"&gt;"roles"&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;"data-scientist"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locations"&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;"new-york"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minSalary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;140000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&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;Ready to run: &lt;a href="https://apify.com/johnvc/wellfound-jobs-api/examples/startup-jobs-new-york?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find Startup Jobs in New York&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Startup jobs in London
&lt;/h2&gt;

&lt;p&gt;Non-US cities work the same way. Check &lt;code&gt;salaryCurrency&lt;/code&gt; on the rows before you compare anything, because a London posting quoting GBP next to a SF posting quoting USD is not a comparison.&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="nl"&gt;"roles"&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;"backend-engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locations"&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;"london"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&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;Ready to run: &lt;a href="https://apify.com/johnvc/wellfound-jobs-api/examples/startup-jobs-london?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find Startup Jobs in London&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Get startup salary and equity data
&lt;/h2&gt;

&lt;p&gt;The comp use case, with descriptions off because nobody averages prose. Drop the rows where the field is &lt;code&gt;null&lt;/code&gt; before you compute anything, and report how many survived.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;with_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;salaryMin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;with_equity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equityMin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; published salary, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_equity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; published equity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;On a 30-row YC sample I ran while writing this, 28 published a salary and only 5 published equity. Those are different sample sizes and deserve separate sentences.&lt;/p&gt;

&lt;p&gt;Ready to run: &lt;a href="https://apify.com/johnvc/wellfound-jobs-api/examples/startup-salary-equity-data?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get Startup Salary and Equity Data&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The example repo
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/johnisanerd" rel="noopener noreferrer"&gt;
        johnisanerd
      &lt;/a&gt; / &lt;a href="https://github.com/johnisanerd/Apify-Wellfound-Jobs-API" rel="noopener noreferrer"&gt;
        Apify-Wellfound-Jobs-API
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Startup jobs API example: pull Wellfound (AngelList) jobs with parsed salary, equity, remote status and YC signals. Python + uv quick start and MCP setup.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💼 Wellfound Jobs API: A Startup Jobs API for Salary and Equity Data&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A startup jobs API for &lt;strong&gt;Wellfound&lt;/strong&gt; (formerly AngelList Talent). Search by role, location, and remote status, and get one clean JSON row per job: the full description, &lt;strong&gt;parsed salary and equity&lt;/strong&gt; ranges, and the hiring startup's signals including &lt;strong&gt;Y Combinator&lt;/strong&gt; backing, top investors, and funding stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actor:&lt;/strong&gt; &lt;a href="https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3" rel="nofollow noopener noreferrer"&gt;https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Video Walkthrough&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=jREWahDGhJM" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ae9fc8cb316cea399ce612e41d29fce4742edcae31b27d5926b0909905d37e90/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f6a52455761684447684a4d2f302e6a7067" alt="Watch the walkthrough"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Text walkthrough&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;This jobs API turns Wellfound's public startup listings into structured data. You give it &lt;code&gt;roles&lt;/code&gt; (Wellfound slugs like &lt;code&gt;software-engineer&lt;/code&gt;, or plain words like "software" and "pm", which are mapped for you) and optionally &lt;code&gt;locations&lt;/code&gt; such as &lt;code&gt;san-francisco&lt;/code&gt;, &lt;code&gt;new-york&lt;/code&gt;, or &lt;code&gt;london&lt;/code&gt;. Each role and location pair becomes its own search, and the API walks the paginated results for you.&lt;/p&gt;

&lt;p&gt;Every row comes back with &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, the full markdown &lt;code&gt;description&lt;/code&gt;, and compensation parsed into real numbers: &lt;code&gt;salaryMin&lt;/code&gt;, &lt;code&gt;salaryMax&lt;/code&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/johnisanerd/Apify-Wellfound-Jobs-API" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Python quick start plus MCP setup walkthroughs for Claude Code, Cursor, and ChatGPT.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping Wellfound jobs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should I build my own Wellfound scraper or use an API?
&lt;/h3&gt;

&lt;p&gt;Build it if the parser is the interesting part of your problem. Use the API if the data is. The three breakages above are the ones you will spend your time on, and they change without warning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use this jobs scraper from Claude or another AI agent?
&lt;/h3&gt;

&lt;p&gt;Yes. It runs as an MCP tool at &lt;code&gt;https://mcp.apify.com/?tools=actors,docs,johnvc/wellfound-jobs-api&lt;/code&gt;. There are also two open agent skills built on it, linked below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule this scraper to run automatically?
&lt;/h3&gt;

&lt;p&gt;Yes, through &lt;a href="https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Schedules&lt;/a&gt;, on any cron you like. Dedupe on &lt;code&gt;url&lt;/code&gt;, which is canonical and survives a company editing the job title.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the scraper return salary and equity for every job?
&lt;/h3&gt;

&lt;p&gt;No, and this is the honest limitation that matters most. It returns what the company published. Plenty of postings carry neither. Always report your coverage count alongside any figure you quote.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can the scraper search Wellfound by keyword?
&lt;/h3&gt;

&lt;p&gt;Not site-wide, because Wellfound does not serve a site-wide free-text search. &lt;code&gt;keyword&lt;/code&gt; filters the jobs on the pages a run already fetched. Drive the search with &lt;code&gt;roles&lt;/code&gt; and &lt;code&gt;locations&lt;/code&gt; and use &lt;code&gt;keyword&lt;/code&gt; to narrow further.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Two open agent skills wrap this API around ready-made workflows, both installable with &lt;code&gt;npx skills add&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/johnisanerd/claude-skill-remote-startup-jobs" rel="noopener noreferrer"&gt;claude-skill-remote-startup-jobs&lt;/a&gt; for the listings.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/johnisanerd/claude-skill-yc-startup-jobs" rel="noopener noreferrer"&gt;claude-skill-yc-startup-jobs&lt;/a&gt; for the comp benchmarking.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;If you want the parser, the code above is a fine starting point. If you want the data, the &lt;a href="https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Wellfound Jobs API&lt;/a&gt; bills per job returned with no start fee, so a run that matches nothing costs essentially nothing.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>tutorial</category>
      <category>career</category>
    </item>
    <item>
      <title>Apify Store Scraper: Market Intelligence on Every Public Actor in 2026</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:36:45 +0000</pubDate>
      <link>https://dev.to/trufflepig/apify-store-scraper-market-intelligence-on-every-public-actor-in-2026-3be0</link>
      <guid>https://dev.to/trufflepig/apify-store-scraper-market-intelligence-on-every-public-actor-in-2026-3be0</guid>
      <description>&lt;p&gt;There are thousands of public Actors on the &lt;a href="https://apify.com/store?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Store&lt;/a&gt;, and if you build or buy scrapers, the store itself is a dataset worth having: who charges what, which tools actually get used, and whose runs quietly fail. I wanted that as rows, not browsing. The &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Store API&lt;/a&gt; sweeps every public Actor into flat JSON with pricing, usage trends, and reliability stats.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doesn't Apify already have an API for this?
&lt;/h2&gt;

&lt;p&gt;Partly, and credit where due: Apify's platform API is excellent for running Actors and lists basic store info. What it does not hand you is the commercial layer as one dataset: 30-day run outcomes split into succeeded, failed, aborted, and timed out, success rates, user trends over 7, 30, and 90 days, per-event pricing detail, and optional README plus input-schema enrichment, one flat row per Actor. Assembling that from public listing pages is exactly the tedious join this Actor does for you, with no platform key or subscription required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Apify Store API returns
&lt;/h2&gt;

&lt;p&gt;The Apify Store API returns one flat JSON row per public Actor with identity, usage, reliability, demand, and pricing fields ready for a spreadsheet or database.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt; / &lt;code&gt;username&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;instagram-scraper&lt;/code&gt; / &lt;code&gt;apify&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;With &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;categories&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;totalUsers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;512340&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plus &lt;code&gt;monthlyUsers&lt;/code&gt; and 7, 30, 90-day trends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;successRate30Days&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;96.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;With full run-outcome breakdowns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reviewRating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;And &lt;code&gt;reviewCount&lt;/code&gt;, &lt;code&gt;bookmarkCount&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pricingModel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PRICE_PER_DATASET_ITEM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;With &lt;code&gt;pricePerUnitUsd&lt;/code&gt; and pricing events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;readme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;full text&lt;/td&gt;
&lt;td&gt;Optional, via &lt;code&gt;includeDetails&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Filter by &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;pricingModel&lt;/code&gt;, or &lt;code&gt;username&lt;/code&gt;, or leave filters empty and sweep the whole store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Actor developers scoping a niche before building, which is how I use it: is the category crowded, what does the incumbent charge, does it actually succeed. Developers choosing a scraper to depend on, where &lt;code&gt;successRate30Days&lt;/code&gt; beats marketing copy. And analysts studying the web-scraping market with actual usage numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;You can research the store by clicking through listings and noting stats in a sheet. It works for five Actors. At fifty, the numbers you copied first are stale, the pricing models refuse to compare cleanly, and you have no reliability data at all unless you check each card again tomorrow. Store pages are built for browsing; questions like "every LinkedIn scraper sorted by 30-day success rate" need a dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Apify Store scraper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Store API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Set a &lt;code&gt;search&lt;/code&gt; term or &lt;code&gt;category&lt;/code&gt;, or leave both empty for a full sweep, and cap with &lt;code&gt;maxItems&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export the rows as JSON, CSV, or Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~store-actor-intelligence-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "search": "google maps", "sortBy": "popularity", "maxItems": 100 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint reference: the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rank a category in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/store-actor-intelligence-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google maps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sortBy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;popularity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;actor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthlyUsers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;successRate30Days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pricingModel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two lines of pandas later you have a league table.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the best scraper for any site
&lt;/h2&gt;

&lt;p&gt;The Actor ships with ready-made "best scrapers" tasks per category, each returning the ranked field with usage and reliability attached: &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-google-maps-scrapers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;best Google Maps scrapers&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-amazon-scrapers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;best Amazon scrapers&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-linkedin-scrapers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;best LinkedIn scrapers&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-youtube-scrapers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;best YouTube scrapers&lt;/a&gt;, with dozens more on the Actor's examples tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shortlist Actors by audience
&lt;/h2&gt;

&lt;p&gt;Role-based variants do the same for a persona instead of a site: &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-apify-actors-for-developers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;best Actors for developers&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-apify-actors-for-marketers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;for marketers&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-apify-actors-for-recruiters?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;for recruiters&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api/examples/best-apify-actors-for-ecommerce-sellers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;for ecommerce sellers&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let Claude compare scrapers over MCP
&lt;/h2&gt;

&lt;p&gt;Through the Model Context Protocol, Claude, Claude Code, and Cursor can call the Actor as a tool, so "which Instagram scraper has the best 30-day success rate under a cent per result" becomes a grounded, current answer. More on Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping the Apify Store
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why use a scraper when Apify has an official API?
&lt;/h3&gt;

&lt;p&gt;The official API is built for running Actors, not for market analysis of the store. This scraper flattens the public commercial signals, usage trends, run outcomes, pricing detail, into one row per Actor, which is the shape competitive questions need.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the Apify Store scraper cost?
&lt;/h3&gt;

&lt;p&gt;You pay per Actor returned on pay-per-event billing, no subscription and no upstream key, and the per-result price is set to make even a full-store sweep cheap. The live rate is on the Store card, and &lt;code&gt;maxItems&lt;/code&gt; caps any run.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I pick a reliable scraper from the output?
&lt;/h3&gt;

&lt;p&gt;Sort on &lt;code&gt;successRate30Days&lt;/code&gt; first, then sanity-check &lt;code&gt;monthlyUsers&lt;/code&gt; and &lt;code&gt;lastRunStartedAt&lt;/code&gt;. A tool with high success, active users, and a recent run is maintained; a pretty README with a 60 percent success rate is a warning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude run this Store scraper through MCP?
&lt;/h3&gt;

&lt;p&gt;Yes. Expose it via the Apify MCP server and it becomes a callable tool in Claude, Claude Code, Cursor, or any MCP client, useful for agent workflows that need to choose tools with evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule the scraper to track a niche weekly?
&lt;/h3&gt;

&lt;p&gt;That is the intended pattern for competitor tracking: save your filter as a task, attach an Apify schedule, and diff usage and pricing across runs. Start from the &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Store API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the scraper leave out?
&lt;/h3&gt;

&lt;p&gt;Anything not on public listings: private Actors, unpublished drafts, and internal revenue numbers do not exist in the output. Public stats are the whole universe, which is plenty for ranking but not a P&amp;amp;L.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;The same sweep works on other catalogs: the &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;RapidAPI Marketplace API&lt;/a&gt; does it for API listings, &lt;a href="https://apify.com/johnvc/apple-app-store-search?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apple App Store Search&lt;/a&gt; for mobile apps, and the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt; adds buyer sentiment for the software behind the listings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The store is a market, and markets reward whoever has the data. Sweep it once with the &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Store API&lt;/a&gt; and see your category with the numbers attached.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>mobile</category>
    </item>
    <item>
      <title>SEC EDGAR API for Developers: Parsed 8-K Filings and Earnings Call Transcripts in 2026</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:28:11 +0000</pubDate>
      <link>https://dev.to/trufflepig/sec-edgar-api-for-developers-parsed-8-k-filings-and-earnings-call-transcripts-in-2026-10op</link>
      <guid>https://dev.to/trufflepig/sec-edgar-api-for-developers-parsed-8-k-filings-and-earnings-call-transcripts-in-2026-10op</guid>
      <description>&lt;p&gt;Every 8-K a US public company files lands on &lt;a href="https://www.sec.gov/edgar/search/" rel="noopener noreferrer"&gt;SEC EDGAR&lt;/a&gt; within minutes, and every earnings call gets transcribed somewhere. Turning either into analyzable data is the grind: EDGAR hands you raw HTML filings, and transcripts live scattered across sites that hate being parsed. This post covers what the free official route gives you, where it stops, and the shortcut: the &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Earnings Call Transcript API&lt;/a&gt; on Apify, which returns parsed 8-Ks and speaker-tagged transcripts as JSON records.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;p&gt;Standard note for anything finance-shaped: this is a data tool. Nothing here is investment advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doesn't SEC EDGAR already have an API?
&lt;/h2&gt;

&lt;p&gt;It does, and it is genuinely free: EDGAR offers full-text search and per-company submission feeds, no key required. What it returns is raw. An 8-K arrives as a filing envelope full of HTML, with the item codes, press release, and guidance language buried inside for you to parse. And earnings call transcripts are not in EDGAR at all, since companies rarely file them. The gap is structure: something that reads the filing for you, tags the items, pulls the guidance sentences, and pairs each call's questions with their answers. That parsing layer is what this Actor sells; the underlying documents were always free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Earnings Call Transcript API returns
&lt;/h2&gt;

&lt;p&gt;The Earnings Call Transcript API returns two record types as structured JSON: parsed 8-K filings with item codes, press releases, guidance sentences, and sentiment, and earnings call transcripts with participants, prepared remarks, and Q&amp;amp;A pairs.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;recordType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;filing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Or &lt;code&gt;transcript&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;itemCodes&lt;/code&gt; / &lt;code&gt;itemNames&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;["2.02", "9.01"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What the 8-K actually announces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pressRelease&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "headline": "Apple reports second quarter results" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extracted from the filing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;guidanceSentences&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"We expect June quarter revenue to grow..."&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forward-looking language, isolated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qaPairs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "question": { "speaker": "Erik Woodring", "affiliation": "Morgan Stanley" }, "answers": [...] }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analyst question matched to executive answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sentiment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "positive": 18.94, "negative": 16.57, "netScore": 0.067 }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deterministic finance-dictionary scoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every record links back to its source with EDGAR &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;documentUrl&lt;/code&gt; fields, so claims stay checkable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Data engineers building event feeds off &lt;code&gt;itemCodes&lt;/code&gt; instead of regex. Fintech and AI builders who want &lt;code&gt;qaPairs&lt;/code&gt; as a clean corpus for LLM and RAG work. And analysts who screen disclosures, material weakness, going concern, guidance withdrawals, across every US filer with a keyword instead of a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;I have written the DIY version: hit the EDGAR feeds, download each 8-K, and parse item codes out of HTML that formats differently per filer. It works until a filing arrives with exhibits arranged some new way, and then your parser silently mislabels events. Transcripts are worse, since there is no official source to parse at all, just third-party pages with their own layouts and access rules. Each piece is a solvable weekend project; keeping both alive across thousands of filers is a job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the earnings call scraper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Earnings Call Transcript API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;tickers&lt;/code&gt; and pick a &lt;code&gt;dataType&lt;/code&gt;: &lt;code&gt;filings&lt;/code&gt;, &lt;code&gt;transcripts&lt;/code&gt;, or &lt;code&gt;both&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export the records as JSON, CSV, or Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~earnings-call-transcript-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "tickers": ["AAPL"], "dataType": "both", "filingsLimit": 5, "transcriptsLimit": 1 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Details in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parse filings and transcripts in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/earnings-call-transcript-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tickers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;both&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transcriptsLimit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recordType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sentence&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;guidanceSentences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  guidance:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Grab a ticker's earnings call transcript
&lt;/h2&gt;

&lt;p&gt;There is a ready-made task per major ticker, each returning the speaker-tagged call in JSON: &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/aapl-earnings-call-transcript?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;AAPL&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/nvda-earnings-call-transcript?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;NVDA&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/tsla-earnings-call-transcript?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;TSLA&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/msft-earnings-call-transcript?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;MSFT&lt;/a&gt;, with more on the Actor's examples tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull parsed 8-Ks by ticker
&lt;/h2&gt;

&lt;p&gt;The filings surface on its own: &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/sec-edgar-8-k-filings-api-by-ticker?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;SEC EDGAR 8-K filings API by ticker&lt;/a&gt; returns recent filings per company, and &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/8-k-filing-api-item-codes-guidance-sentiment?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;8-K item codes, guidance, and sentiment&lt;/a&gt; shows the parsed structure in full.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screen EDGAR for red-flag language
&lt;/h2&gt;

&lt;p&gt;Full-text keyword search across all US filers powers the screener tasks: &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/material-weakness-disclosure-screener?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;material weakness disclosures&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/going-concern-warning-screener?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;going concern warnings&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/guidance-withdrawal-screener?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;guidance withdrawals&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/financial-restatement-screener?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;financial restatements&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor material events as a feed
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;onlyNew&lt;/code&gt; set, scheduled runs return only fresh records, which turns item-code filters into event trackers: &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/sec-8k-material-events-monitor?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;material events watchlist&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/sec-8k-cybersecurity-incident-monitor?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;cybersecurity incidents under Item 1.05&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/sec-8k-executive-departure-tracker?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;executive departures under Item 5.02&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build an LLM dataset from Q&amp;amp;A pairs
&lt;/h2&gt;

&lt;p&gt;Because &lt;code&gt;qaPairs&lt;/code&gt; ships pre-matched, the task &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/earnings-call-qa-dataset-llm-rag?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Earnings call Q&amp;amp;A dataset for LLM and RAG&lt;/a&gt; produces a training-ready corpus, and &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api/examples/earnings-guidance-monitor?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Earnings guidance monitor&lt;/a&gt; does the same for forward-looking statements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Query filings from Claude over MCP
&lt;/h2&gt;

&lt;p&gt;Through the Model Context Protocol, Claude, Claude Code, and Cursor can call the Actor mid-conversation, so "summarize Apple's latest 8-K and its guidance language" runs against the actual filing. You can read more about Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping earnings calls and SEC filings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  EDGAR is free, so why pay for a scraper at all?
&lt;/h3&gt;

&lt;p&gt;Because EDGAR returns documents and this scraper returns data. You are paying for the parsing: item codes tagged, press releases extracted, guidance sentences isolated, Q&amp;amp;A matched to speakers, plus transcripts that EDGAR never had.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the earnings call scraper cost per record?
&lt;/h3&gt;

&lt;p&gt;One event per record returned, a parsed filing or a structured transcript, with no start fee. One hundred records cost about a cent, so a quarterly refresh of a 50-ticker watchlist runs about that.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does a transcript from the scraper include?
&lt;/h3&gt;

&lt;p&gt;Participants with roles, prepared remarks tagged by speaker, analyst questions paired with executive answers, guidance sentences, and a sentiment score. No audio, and typically available within hours of the call.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude run this scraper through MCP?
&lt;/h3&gt;

&lt;p&gt;Yes. Connect the Apify MCP server and the Actor becomes a callable tool, which makes filings and transcripts available to an agent as grounded context instead of recall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule the scraper to watch for new 8-Ks?
&lt;/h3&gt;

&lt;p&gt;That is what &lt;code&gt;onlyNew&lt;/code&gt; is for. Save a task with your tickers or item codes, attach an Apify schedule, and each run returns only records you have not seen. Start from the &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Earnings Call Transcript API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where does the scraper's coverage end?
&lt;/h3&gt;

&lt;p&gt;Transcripts cover roughly 1,000 to 1,500 mostly large and mid cap US companies per quarter, with an archive back to about 2007, so thin micro caps may have filings but no call. Sentiment comes from a deterministic finance dictionary rather than an LLM, and there are no 10-K or 10-Q statements and no XBRL fundamentals here.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Event data pairs naturally with prices and context: the &lt;a href="https://apify.com/johnvc/google-finance-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Finance API&lt;/a&gt; adds live quotes and financial statements, the &lt;a href="https://apify.com/johnvc/us-congress-financial-disclosures-and-stock-trading-data?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Congress Financial Disclosures API&lt;/a&gt; tracks another primary-source signal, and the &lt;a href="https://apify.com/johnvc/crunchbase-company-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Crunchbase Company API&lt;/a&gt; fills in firmographics for the same names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The filings were always public; the structure was the missing part. Point the &lt;a href="https://apify.com/johnvc/earnings-call-transcript-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Earnings Call Transcript API&lt;/a&gt; at your watchlist and get 8-Ks and calls back as records you can actually compute on.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Reputation Research on Google Maps: Spot Out-of-Town Reviewers with Public Data in 2026</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Wed, 19 Aug 2026 08:11:04 +0000</pubDate>
      <link>https://dev.to/trufflepig/reputation-research-on-google-maps-spot-out-of-town-reviewers-with-public-data-in-2026-2bh0</link>
      <guid>https://dev.to/trufflepig/reputation-research-on-google-maps-spot-out-of-town-reviewers-with-public-data-in-2026-2bh0</guid>
      <description>&lt;p&gt;A suspicious one-star review usually raises the same question: is this person even local? The review history behind any &lt;a href="https://www.google.com/maps" rel="noopener noreferrer"&gt;Google Maps&lt;/a&gt; contributor profile is public, but it reads as an endless scroll of place names, not an answer. I'll show the manual way to read that footprint, why it does not scale, and the shortcut: the &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Reviewer Geo Profile API&lt;/a&gt; on Apify, which clusters a reviewer's public review locations into a region-level home estimate with a confidence score.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there an API for Google Maps reviewer activity?
&lt;/h2&gt;

&lt;p&gt;Google's official APIs return a few reviews per place, but nothing per reviewer: no endpoint accepts a contributor and returns where they review. The public contributor page shows the history, one scroll at a time, in whatever language each review was written. This Actor reads that public history and adds the analysis you would otherwise build yourself: reverse geocoding against an offline GeoNames dataset, then spatial clustering into a standardized home-region estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Reviewer Geo Profile API returns
&lt;/h2&gt;

&lt;p&gt;The Reviewer Geo Profile API returns one derived row per reviewer: a standardized home-region guess with ISO codes, a confidence score, home-versus-travel review counts, a regional footprint, and centroid plus bounding-box geometry.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data point&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Home-region guess&lt;/td&gt;
&lt;td&gt;Chicago, Illinois, US&lt;/td&gt;
&lt;td&gt;standardized names plus ISO codes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidence score&lt;/td&gt;
&lt;td&gt;0.86&lt;/td&gt;
&lt;td&gt;cluster-based, how dominant the home cluster is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home vs travel counts&lt;/td&gt;
&lt;td&gt;61 home, 14 travel&lt;/td&gt;
&lt;td&gt;separates the base cluster from outliers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regional footprint&lt;/td&gt;
&lt;td&gt;top regions with counts and shares&lt;/td&gt;
&lt;td&gt;a compact travel map&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geometry&lt;/td&gt;
&lt;td&gt;centroid and bounding box&lt;/td&gt;
&lt;td&gt;ready for plotting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewer metadata&lt;/td&gt;
&lt;td&gt;public profile basics&lt;/td&gt;
&lt;td&gt;for context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Trust-and-safety and review-fraud analysts, businesses vetting a reviewer's footprint before responding or escalating a dispute, and researchers doing reputation research across batches of reviewers for the same place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;By hand, you open the contributor profile, scroll until it stops loading, note each reviewed place, and look up where those places are. An active reviewer has hundreds of reviews, the place names arrive unstandardized, and "Chicago Loop" and "Chicago" read as different locations unless you normalize them yourself. You end up with a hand-built map, a gut feeling, no confidence number, and an hour gone per reviewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Google Maps Reviewer Geo Profile API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Reviewer Geo Profile API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Paste a contributor ID, the long numeric ID in a reviewer's profile URL.&lt;/li&gt;
&lt;li&gt;Run it and export; one derived row per reviewer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~google-maps-reviewer-geo-profile-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "contributorId": "107022004965696773221" }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint mechanics are in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;. Two knobs matter: &lt;code&gt;regionGranularity&lt;/code&gt; sets whether the guess lands at city, state, or country level, and &lt;code&gt;minCityPopulation&lt;/code&gt; snaps metro neighborhoods under their principal city.&lt;/p&gt;

&lt;h2&gt;
  
  
  Profile reviewers in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/google-maps-reviewer-geo-profile-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contributorIds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;107022004965696773221&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regionGranularity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResultsPerContributor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;profile&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the home-region guess and its confidence first, then the home-versus-travel split; together they tell you whether a footprint looks locally coherent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bulk-analyze reviewer home regions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/bulk-analyze-google-reviewers-home-regions?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Bulk analyze Google reviewers home regions&lt;/a&gt; runs a list of contributor IDs and returns one row each; it is also published in &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/bulk-analyze-google-reviewers-home-regions-ru?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Russian&lt;/a&gt; and &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/bulk-analyze-google-reviewers-home-regions-zh?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detect out-of-town reviewers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/detect-out-of-town-google-reviewers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Detect out of town Google reviewers&lt;/a&gt; flags reviewers whose home cluster sits nowhere near the business being reviewed (&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/detect-out-of-town-google-reviewers-ru?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Russian&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/detect-out-of-town-google-reviewers-zh?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Find a reviewer's home country
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/find-a-google-reviewer-s-home-country?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find a Google reviewer's home country&lt;/a&gt; sets the granularity to country for the coarse view (&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/find-a-google-reviewer-s-home-country-ru?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Russian&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/find-a-google-reviewer-s-home-country-zh?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Spot geographically inconsistent reviewers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/spot-geographically-inconsistent-reviewers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Spot geographically inconsistent reviewers&lt;/a&gt; surfaces footprints too scattered to be one person's normal life, the classic fraud-research signal (&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/spot-geographically-inconsistent-reviewers-ru?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Russian&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/spot-geographically-inconsistent-reviewers-zh?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify a reviewer is a real local
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/verify-a-google-reviewer-is-a-real-local?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Verify a Google reviewer is a real local&lt;/a&gt; is the positive case: confirm a champion is genuinely local before featuring their review (&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/verify-a-google-reviewer-is-a-real-local-ru?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Russian&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/verify-a-google-reviewer-is-a-real-local-zh?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Use it from Claude via MCP
&lt;/h2&gt;

&lt;p&gt;Through the Apify MCP server, Claude, Claude Code, or Cursor can take a contributor ID from a review you are discussing and return the geo profile mid-conversation. The setup lives in &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/profile-a-google-reviewer-s-location-via-mcp?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Profile a Google reviewer's location via MCP&lt;/a&gt; (&lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/profile-a-google-reviewer-s-location-via-mcp-ru?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Russian&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api/examples/profile-a-google-reviewer-s-location-via-mcp-zh?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt;), and Claude itself is at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping Google Maps reviewer data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is it OK to run a scraper on a reviewer's profile?
&lt;/h3&gt;

&lt;p&gt;The Actor reads only public review history, the same pages anyone can open in a browser, and outputs a region-level aggregate rather than an address. It exists for business analytics: review-fraud research, reviewer vetting, and reputation research on public activity. Use it for that, not for anything aimed at individuals.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the reviewer geo scraper cost?
&lt;/h3&gt;

&lt;p&gt;Two cents per contributor analyzed on the free tier, plus a fraction of a cent per run to start. Depth is included: profiling 200 reviews of history costs the same per reviewer as 50.&lt;/p&gt;

&lt;h3&gt;
  
  
  How accurate is the scraper's home-region estimate?
&lt;/h3&gt;

&lt;p&gt;It is an inference, and the output says so. The densest review cluster stands in for a base location, with a confidence score attached; travel-heavy accounts blur the signal, and deeper history, up to 200 reviews, sharpens it. I treat it as a research signal, never as a verified location.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude call this scraper over MCP?
&lt;/h3&gt;

&lt;p&gt;Yes, the Actor registers as an MCP tool, so agents in Claude, Claude Code, and Cursor can profile a contributor ID on demand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule the scraper to re-check reviewers?
&lt;/h3&gt;

&lt;p&gt;Yes: save the ID list as a task and schedule it monthly to watch for changes in geographic coherence over time. Start from the &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Reviewer Geo Profile API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;This pairs naturally with the &lt;a href="https://apify.com/johnvc/google-maps-contributor-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Contributor Reviews API&lt;/a&gt;, which pulls the raw review history the analysis is built on, plus the &lt;a href="https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Places API&lt;/a&gt; for place details and the &lt;a href="https://apify.com/johnvc/google-local-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Local API&lt;/a&gt; for local listings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Where a reviewer actually reviews is public signal; it just needed structure and a confidence score. Run one contributor ID through the &lt;a href="https://apify.com/johnvc/google-maps-reviewer-geo-profile-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Reviewer Geo Profile API&lt;/a&gt; and read the row for yourself.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>geospatial</category>
    </item>
    <item>
      <title>SKU Tracking with Google Shopping: Bulk Price Monitoring at $1.50 per 1,000 Products</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Tue, 18 Aug 2026 19:09:43 +0000</pubDate>
      <link>https://dev.to/trufflepig/sku-tracking-with-google-shopping-bulk-price-monitoring-at-150-per-1000-products-55l6</link>
      <guid>https://dev.to/trufflepig/sku-tracking-with-google-shopping-bulk-price-monitoring-at-150-per-1000-products-55l6</guid>
      <description>&lt;p&gt;Price monitoring is a volume game. Watching one product is trivial; watching five hundred SKUs across every retailer &lt;a href="https://shopping.google.com/" rel="noopener noreferrer"&gt;Google Shopping&lt;/a&gt; indexes, daily, is where tooling either gets expensive or gets built. I built the &lt;a href="https://apify.com/johnvc/google-shopping-lite-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping Lite API&lt;/a&gt; for exactly that middle path: send a batch of search terms, get one flat JSON row per product with price, retailer, rating, delivery, and link, at $1.50 per 1,000 products.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there a Google Shopping API?
&lt;/h2&gt;

&lt;p&gt;Not for reading the marketplace. Google's official shopping APIs exist to manage your own merchant listings, which is the opposite direction: you push your products in, you don't query what everyone else charges. There's no public endpoint for "show me every retailer selling this SKU and their prices." That query is exactly what competitive pricing work needs, so the practical answer is a scraper consumed as an API: search terms in, product rows out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Google Shopping Lite API returns
&lt;/h2&gt;

&lt;p&gt;The Google Shopping Lite API returns one structured row per product: title, price, retailer, rating, delivery info, and the product link.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sony WH-1000XM5 Wireless Headphones&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Product name as listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$328.00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Localized to the country you target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retailer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Best Buy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who's selling at that price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rating&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Star rating when shown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Free delivery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shipping line as displayed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Route to the offer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each search term returns roughly 40 to 60 products per page, and &lt;code&gt;maxResultsPerSearch&lt;/code&gt; caps how deep each term goes. The "Lite" in the name is the point: no nested page structures, just rows you can load straight into a dataframe or a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;E-commerce operators doing SKU tracking against competitors. Dropshipping researchers scanning what a niche actually sells for before committing inventory. Analysts building price indexes across retailers. And anyone wiring price checks into AI agent workflows, where an agent needs current numbers instead of its training data's memory of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;Google Shopping in a browser is pleasant; Google Shopping in a script is hostile. Results render through JavaScript, layouts rotate between grid variants, prices arrive in localized formats you have to normalize, and sustained automated traffic gets you a captcha. The real killer for bulk work is multiplication: 500 search terms times retries times proxy rotation is an infrastructure bill and an on-call rotation. For a one-off market check, fine, suffer through it. For monitoring, you want the parser to be someone else's standing problem. Mine, as it happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Google Shopping Lite API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/google-shopping-lite-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping Lite API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Add your &lt;code&gt;searchTerms&lt;/code&gt; list and pick a &lt;code&gt;country&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export rows as JSON or CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~google-shopping-lite-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "searchTerms": ["wireless headphones", "noise cancelling earbuds"], "country": "us", "maxResultsPerSearch": 50 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full endpoint reference in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bulk price pulls in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/google-shopping-lite-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchTerms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lego technic 42143&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lego icons 10311&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResultsPerSearch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;retailer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search by SKU-specific terms like model numbers and the rows map cleanly onto your catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor competitor prices
&lt;/h2&gt;

&lt;p&gt;The task &lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/monitor-competitor-prices-google-shopping?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Monitor competitor prices on Google Shopping&lt;/a&gt; is the core commercial setup: your product terms, on repeat, diffed between runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare prices across retailers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/compare-product-prices-google-shopping?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Compare product prices on Google Shopping&lt;/a&gt; answers the single-product question, who sells it and for how much, in one run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export a whole category
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/bulk-export-google-shopping-prices?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Bulk export Google Shopping prices&lt;/a&gt; shows the many-terms pattern that ends in one CSV, useful for market sizing and assortment research.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track a niche over time
&lt;/h2&gt;

&lt;p&gt;Two hobbyist-flavored examples double as templates for any niche: &lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/track-game-console-prices-google-shopping?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;track game console prices&lt;/a&gt; and &lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/track-lego-set-prices-bulk-google-shopping?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;track LEGO set prices in bulk&lt;/a&gt;. Swap the terms and the same tasks track GPUs or sneakers.&lt;/p&gt;

&lt;h2&gt;
  
  
  For cross-border sellers
&lt;/h2&gt;

&lt;p&gt;Two Chinese-language tasks serve cross-border e-commerce teams: &lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/google-gouwu-bijia-kuajing-xuanpin?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping price comparison for product selection&lt;/a&gt; and &lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/piliang-jiankong-jingpin-jiage?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;bulk competitor price monitoring&lt;/a&gt;, both using the &lt;code&gt;country&lt;/code&gt; and &lt;code&gt;language&lt;/code&gt; inputs to read a target market from outside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price checks inside AI agent workflows
&lt;/h2&gt;

&lt;p&gt;Over the Model Context Protocol, the Actor becomes a tool for Claude, Claude Code, and Cursor, so "what's the cheapest current price for this model and who sells it" gets answered with live rows mid-conversation. The task &lt;a href="https://apify.com/johnvc/google-shopping-lite-api/examples/compare-product-prices-in-claude-via-a-shopping-mcp?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Compare product prices in Claude via a shopping MCP&lt;/a&gt; has the configuration, and you can read more about Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about Google Shopping scraping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does the shopping scraper cost at scale?
&lt;/h3&gt;

&lt;p&gt;$1.50 per 1,000 products, billed per product returned, plus a negligible start fee. A 500-term sweep at 40 products each is 20,000 rows, about $30. &lt;code&gt;maxResultsPerSearch&lt;/code&gt; is your budget dial, and free Apify credit covers first experiments.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is this Lite scraper different from the full Google Shopping API Actor?
&lt;/h3&gt;

&lt;p&gt;Lite trades depth for speed and unit cost: one flat row per product, minimal fields, priced for bulk. The full &lt;a href="https://apify.com/johnvc/google-shopping-api-google-shopping-products-prices-deals?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping API&lt;/a&gt; covers products, prices, and deals in richer structures when you need more than the price row.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude call this scraper in an agent workflow?
&lt;/h3&gt;

&lt;p&gt;Yes. Registered through Apify's MCP server it's a callable tool in Claude, Claude Code, and Cursor, which is the cleanest way to give an agent live price data.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I schedule the scraper for daily SKU tracking?
&lt;/h3&gt;

&lt;p&gt;Save your term list as a task, attach an Apify schedule, and each run appends dated rows so price history accumulates automatically. Start from the &lt;a href="https://apify.com/johnvc/google-shopping-lite-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping Lite API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What won't a search-results scraper capture?
&lt;/h3&gt;

&lt;p&gt;Anything deeper than the results page: full spec sheets, seller stock levels, or historical prices Google doesn't display. Matching returned rows to your exact SKUs is also on you, which is why model-number search terms beat generic ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Neighboring Actors for commerce data: the full &lt;a href="https://apify.com/johnvc/google-shopping-api-google-shopping-products-prices-deals?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping API&lt;/a&gt; for deal-level detail, the &lt;a href="https://apify.com/johnvc/google-immersive-product-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Immersive Product API&lt;/a&gt; for Google's immersive product panels, and the &lt;a href="https://apify.com/johnvc/google-local-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Local API&lt;/a&gt; when the competition is local stores rather than online carts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;SKU tracking shouldn't cost more than the margin it protects. At $1.50 per 1,000 products, the &lt;a href="https://apify.com/johnvc/google-shopping-lite-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Shopping Lite API&lt;/a&gt; makes daily price visibility a rounding error; start with your ten most contested SKUs.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Google Autocomplete API: Turn Type-Ahead Suggestions into JSON in 2026 (Python, MCP, No-Code)</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Tue, 18 Aug 2026 08:10:50 +0000</pubDate>
      <link>https://dev.to/trufflepig/google-autocomplete-api-turn-type-ahead-suggestions-into-json-in-2026-python-mcp-no-code-1bka</link>
      <guid>https://dev.to/trufflepig/google-autocomplete-api-turn-type-ahead-suggestions-into-json-in-2026-python-mcp-no-code-1bka</guid>
      <description>&lt;p&gt;Type half a query into &lt;a href="https://www.google.com" rel="noopener noreferrer"&gt;Google&lt;/a&gt; and the dropdown finishes your sentence: ranked, localized, and drawn from what people actually search. I think of it as Google publishing its own query logs, ten lines at a time, and there is no clean official way to collect it. This post covers the DIY route, its potholes, and the &lt;a href="https://apify.com/johnvc/google-autocomplete-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Autocomplete API&lt;/a&gt; on Apify, which returns the ranked suggestion list for any batch of partial queries as JSON.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there an official Google Autocomplete API?
&lt;/h2&gt;

&lt;p&gt;Not for web search. Google Maps Platform sells Places Autocomplete, which completes place names inside a maps product, and that is a different job. For general search suggestions there is only an undocumented endpoint that returns quirky JSONP, throttles you at volume, and can change any day. So in practice a Google Autocomplete API means a scraper consumed as an API: partial queries in, ranked suggestions out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Google Autocomplete API returns
&lt;/h2&gt;

&lt;p&gt;The Google Autocomplete API returns the ranked suggestion list for each partial query as structured JSON: one record per suggestion, linking the source query, the suggestion's rank, and the suggested text, localized by country and language.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data point&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input query&lt;/td&gt;
&lt;td&gt;coffee near&lt;/td&gt;
&lt;td&gt;the partial query you sent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suggested text&lt;/td&gt;
&lt;td&gt;coffee near me open now&lt;/td&gt;
&lt;td&gt;one record per suggestion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rank&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;position in the dropdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Country (&lt;code&gt;gl&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;two-letter localization code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language (&lt;code&gt;hl&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;en&lt;/td&gt;
&lt;td&gt;interface language for suggestions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;SEO and PPC people expanding seed keywords into real phrases, builders resolving vague place queries before a Maps or Places lookup, and agent developers who want autocomplete as a disambiguation tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;Manual collection is an incognito window and a spreadsheet: type each seed, transcribe ten suggestions, switch your VPN to change country, repeat. The script version hits the unofficial suggest endpoint, and it works right up until it does not: undocumented parameters, JSONP wrappers to strip, localization that follows your IP instead of your settings, and throttling once you send real volume. Neither version leaves you with anything stable enough to build on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Google Autocomplete API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/google-autocomplete-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Autocomplete API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Add partial queries under &lt;code&gt;queries&lt;/code&gt;, like &lt;code&gt;coffee near&lt;/code&gt;, and set &lt;code&gt;gl&lt;/code&gt; and &lt;code&gt;hl&lt;/code&gt; if you want another market.&lt;/li&gt;
&lt;li&gt;Run it and export the suggestions as JSON or CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~google-autocomplete-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "queries": ["coffee near"], "gl": "us", "hl": "en" }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full endpoint reference: the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expand keywords in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/google-autocomplete-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coffee near&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;best pizza in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;suggestion&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suggestion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every record ties back to its input query with a rank, so grouping by seed and sorting by rank rebuilds each dropdown exactly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get suggestions for any keyword
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/get-google-search-suggestions-for-any-keyword?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get Google search suggestions for any keyword&lt;/a&gt; is the plain starting point: one seed, the ranked list back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mine long-tail keyword ideas
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/get-long-tail-keyword-ideas-from-google-autocomplete?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get long tail keyword ideas from Google autocomplete&lt;/a&gt; expands seeds into the specific phrases people type, which is where low-competition content lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull question keywords
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/get-question-keywords-from-google-autocomplete?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get question keywords from Google autocomplete&lt;/a&gt; harvests question-format phrases, ready-made for FAQ sections and content planning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find negative keywords for Google Ads
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/find-negative-keywords-for-google-ads?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Find negative keywords for Google Ads&lt;/a&gt; surfaces suggestions that reveal intents you do not want to pay for, like free, cheap, or DIY variants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyword research data as JSON
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/get-keyword-research-data-as-json-from-google?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get keyword research data as JSON from Google&lt;/a&gt; is the spreadsheet-ready version of the whole loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  It speaks Chinese too
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/google-sousuo-xialaci-zhongwen?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google search suggestions in Chinese&lt;/a&gt; and &lt;a href="https://apify.com/johnvc/google-autocomplete-api/examples/zhongwen-changwei-guanjianci?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Chinese long-tail keywords&lt;/a&gt; run the same pattern for Chinese-language markets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use it from Claude via MCP
&lt;/h2&gt;

&lt;p&gt;Ask Claude what people search after "best crm for" and, with the Actor connected as an MCP tool through Apify, it fetches the live list instead of guessing. The same tool works in Claude Code and Cursor for agent-driven query expansion, and &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt; is where to pick up Claude if you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping Google Autocomplete
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does the Google Autocomplete scraper cost, and is anything free?
&lt;/h3&gt;

&lt;p&gt;Billing is 0.2 cents per suggestion returned on the free tier, so a seed returning ten suggestions costs about two cents. New Apify accounts carry free platform credit, which means early keyword batches usually cost nothing out of pocket.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not scrape Google's suggest endpoint myself instead of using a hosted scraper?
&lt;/h3&gt;

&lt;p&gt;For a weekend test, go ahead; that endpoint is how many of us started. For anything recurring you inherit undocumented parameters, response-format changes, and throttling, and the hosted version trades a fraction of a cent per suggestion for never owning that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can the scraper localize suggestions by country and language?
&lt;/h3&gt;

&lt;p&gt;Yes: &lt;code&gt;gl&lt;/code&gt; sets the country and &lt;code&gt;hl&lt;/code&gt; the language for each run, so you can pull the same seeds for the US, Germany, and Japan and diff the dropdowns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the scraper work as an MCP tool in Claude or Cursor?
&lt;/h3&gt;

&lt;p&gt;Yes, via the Apify MCP server it registers as a callable tool, which turns autocomplete into a live lookup step inside agent workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule the scraper to keep keyword lists fresh?
&lt;/h3&gt;

&lt;p&gt;Yes, recurring runs are the intended pattern: schedule a task with your seed list and accumulate suggestion history for trend analysis. Set it up from the &lt;a href="https://apify.com/johnvc/google-autocomplete-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Autocomplete API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What won't an autocomplete scraper tell you?
&lt;/h3&gt;

&lt;p&gt;Search volume or difficulty. A suggestion means Google predicts the phrase, not how often people search it, so pair the output with a volume source before betting a content calendar on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Adjacent search-data Actors: the &lt;a href="https://apify.com/johnvc/Google-AI-Overview-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google AI Overview API&lt;/a&gt; for what Google's AI answers say, the &lt;a href="https://apify.com/johnvc/google-forums-search-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Forums Search API&lt;/a&gt; for discussion results, and the &lt;a href="https://apify.com/johnvc/DuckDuckGo-Scraper-for-serp-rankings?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;DuckDuckGo SERP Scraper&lt;/a&gt; for rankings on the private-search side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The dropdown was always the most honest keyword data Google shows; now it exports. Feed a few seeds to the &lt;a href="https://apify.com/johnvc/google-autocomplete-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Autocomplete API&lt;/a&gt; and see what your customers type.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>seo</category>
    </item>
    <item>
      <title>Customer Sentiment from G2 Reviews: Scrape B2B Software Feedback as JSON in 2026</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Mon, 17 Aug 2026 19:09:25 +0000</pubDate>
      <link>https://dev.to/trufflepig/customer-sentiment-from-g2-reviews-scrape-b2b-software-feedback-as-json-in-2026-3f6b</link>
      <guid>https://dev.to/trufflepig/customer-sentiment-from-g2-reviews-scrape-b2b-software-feedback-as-json-in-2026-3f6b</guid>
      <description>&lt;p&gt;B2B software decisions get argued out in public on &lt;a href="https://www.g2.com" rel="noopener noreferrer"&gt;G2&lt;/a&gt;, in tens of thousands of structured reviews with ratings, roles, and company sizes attached. For anyone doing competitive intelligence or tracking customer sentiment, that corpus is gold, and it only exists as web pages. This post covers the manual route, why scripting it yourself hurts, and the shortcut: the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt; on Apify, which turns product URLs into one JSON row per review.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does G2 have an API?
&lt;/h2&gt;

&lt;p&gt;Not one you can just sign up for. G2's official data access is aimed at vendors and partners under commercial agreements, so an independent developer or analyst who wants review data has no self-serve endpoint. The practical alternative is a scraper you call like an API: send G2 product review URLs, get the public reviews back as structured JSON, capped and sorted the way you asked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the G2 Reviews API returns
&lt;/h2&gt;

&lt;p&gt;The G2 Reviews API returns each public review as a JSON row with rating, title, full text, pros and cons, reviewer role, company size, date, and a verified flag.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;productName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Asana&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The product reviewed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0 to 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pros&lt;/code&gt; / &lt;code&gt;cons&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"The interface is simple enough to learn quickly."&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Best-effort split from the review body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reviewerRole&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Program Manager&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When disclosed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;companySize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Small-Business (50 or fewer emp.)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;G2's size band&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;verified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Derived from tags like "Validated Reviewer"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flip &lt;code&gt;includeProductMetadata&lt;/code&gt; on and each product adds a metadata row with category, overall star rating, review count, vendor, and named competitors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Product marketers doing competitor analysis who want rivals' cons as a spreadsheet column. Product and CS teams measuring customer sentiment by role and company size instead of vibes. And buyers or analysts comparing tools on evidence, with the incentivized-review tags visible instead of hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;Reading G2 reviews in a browser is fine until you need counts. Copy-paste dies within a page. Scripting against the site directly means JavaScript rendering, aggressive anti-bot friction, and review bodies scattered across question-and-answer fragments you have to reassemble per review. G2 also updates its markup often enough that a homemade parser needs regular surgery. I gave my version two rewrites before concluding the maintenance was the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the G2 reviews scraper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Paste one or more &lt;code&gt;productUrls&lt;/code&gt; like &lt;code&gt;https://www.g2.com/products/asana/reviews&lt;/code&gt;, set &lt;code&gt;maxReviewsPerProduct&lt;/code&gt; and &lt;code&gt;sortBy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export the reviews as JSON, CSV, or Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~g2-reviews-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "productUrls": ["https://www.g2.com/products/asana/reviews"], "maxReviewsPerProduct": 100, "sortBy": "recent" }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run mechanics are in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analyze reviews in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/g2-reviews-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;productUrls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.g2.com/products/asana/reviews&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxReviewsPerProduct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sortBy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewerRole&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cons&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter on &lt;code&gt;companySize&lt;/code&gt; and you have sentiment segmented by market tier in a dozen lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use case: benchmark a competitor's cons
&lt;/h2&gt;

&lt;p&gt;Run your product and two rivals in one &lt;code&gt;productUrls&lt;/code&gt; list, sorted by &lt;code&gt;recent&lt;/code&gt;, and pull only the &lt;code&gt;cons&lt;/code&gt; column. The result is a live list of what users dislike about each tool, in their words, segmented by reviewer role. Feed it to an LLM for theme clustering and you have a competitive brief that updates whenever you rerun the input, which beats quarterly analyst decks on both freshness and price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use case: watch customer sentiment move after a launch
&lt;/h2&gt;

&lt;p&gt;Sort by &lt;code&gt;recent&lt;/code&gt;, cap at the last hundred reviews, and score &lt;code&gt;rating&lt;/code&gt; over &lt;code&gt;datePublished&lt;/code&gt; weekly. A pricing change or a rough release shows up in the trend line within weeks, with &lt;code&gt;verified&lt;/code&gt; and the incentivized tags letting you weight reviews honestly. Because the input is just a saved task, the whole pipeline is a schedule plus a chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read G2 from Claude over MCP
&lt;/h2&gt;

&lt;p&gt;Exposed through the Model Context Protocol, the Actor becomes a callable tool in Claude, Claude Code, and Cursor, so "summarize the recent cons for Asana from small-business reviewers" runs a live pull instead of quoting stale training data. You can read more about Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping G2 reviews
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is there an official G2 API, or is a scraper the only route?
&lt;/h3&gt;

&lt;p&gt;Official access exists for vendors and partners under agreements, not as a public developer API. For everyone else, a scraper against the public review pages is the workable path, and this one packages it with API ergonomics.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the G2 reviews scraper cost to run?
&lt;/h3&gt;

&lt;p&gt;Billing is per review returned, with no per-run setup fee, plus an optional $0.003 per product when &lt;code&gt;includeProductMetadata&lt;/code&gt; is on. The current per-review price sits on the Store card, and &lt;code&gt;maxReviewsPerProduct&lt;/code&gt; caps spend before you start.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I do competitor analysis with this scraper?
&lt;/h3&gt;

&lt;p&gt;Put your competitors' review URLs in one run, sort by &lt;code&gt;recent&lt;/code&gt;, and compare &lt;code&gt;pros&lt;/code&gt;, &lt;code&gt;cons&lt;/code&gt;, and rating trends side by side. The optional metadata row even lists each product's named competitors, which is a handy expansion seed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude or another agent drive the scraper over MCP?
&lt;/h3&gt;

&lt;p&gt;Yes. Connect the Apify MCP server and the Actor appears as a tool in any MCP client, which makes live review pulls available inside agent workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule the scraper to monitor reviews?
&lt;/h3&gt;

&lt;p&gt;Review monitoring is the intended recurring use: save your product list as a task, attach an Apify schedule, and each run appends the newest reviews for diffing. Start from the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the scraper's honest limits?
&lt;/h3&gt;

&lt;p&gt;It returns what the public pages show: products with few reviews yield few rows, reviewer names and roles appear only when disclosed, and the pros and cons split is best-effort parsing of G2's Q&amp;amp;A format. Incentivized reviews are labeled, not laundered.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Vendor intelligence has more than one axis: the &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor Reviews API&lt;/a&gt; shows how the same companies treat employees, and the &lt;a href="https://apify.com/johnvc/crunchbase-company-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Crunchbase Company API&lt;/a&gt; adds funding and firmographics behind the products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The software market reviews itself in public; the only missing piece was machine-readable access. Point the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt; at a product page and start counting what people actually say.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Glassdoor API in 2026: Scrape Company Reviews into Clean JSON</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Mon, 17 Aug 2026 08:10:47 +0000</pubDate>
      <link>https://dev.to/trufflepig/glassdoor-api-in-2026-scrape-company-reviews-into-clean-json-20a0</link>
      <guid>https://dev.to/trufflepig/glassdoor-api-in-2026-scrape-company-reviews-into-clean-json-20a0</guid>
      <description>&lt;p&gt;Employee reviews on &lt;a href="https://www.glassdoor.com" rel="noopener noreferrer"&gt;Glassdoor&lt;/a&gt; are the closest thing we have to ground truth on what working somewhere is like, and they are locked inside a page built for reading, not analysis. If you want pros, cons, and per-category ratings across a few hundred reviews, you need them as rows, not paragraphs. This post walks the DIY route and then the shortcut: the &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor Reviews API&lt;/a&gt; on Apify, which takes company review URLs and returns each review as structured JSON.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does Glassdoor have an API?
&lt;/h2&gt;

&lt;p&gt;Effectively no. Glassdoor once ran a partner API, but it is closed to new developers, which is why a search for "glassdoor api" turns up forum threads and scrapers rather than a signup page. If you need review data today, the practical route is a scraper you call like an API: send a company review URL, get the reviews back as JSON, capped and filtered the way an endpoint would do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Glassdoor Reviews API returns
&lt;/h2&gt;

&lt;p&gt;The Glassdoor Reviews API returns one JSON row per employee review with the rating, summary, pros, cons, employment details, and date, plus a per-category ratings breakdown view.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;companyName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Google&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;With the source &lt;code&gt;companyUrl&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overallRating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per review, 1 to 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pros&lt;/code&gt; / &lt;code&gt;cons&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Great company to be at"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The review text, split&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;employmentType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Former employee&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;With &lt;code&gt;employmentStatus&lt;/code&gt; like &lt;code&gt;CONTRACT&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;datePublished&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-07-05T00:00:00.000Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Feeds the &lt;code&gt;days&lt;/code&gt; filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ratingWorkLife&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Breakdown view, with &lt;code&gt;ratingCultureValues&lt;/code&gt;, &lt;code&gt;ratingSeniorLeadership&lt;/code&gt;, and more&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The breakdown view carries category ratings for career opportunities, compensation, culture, work-life balance, leadership, and diversity, which is where the analyzable signal lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Employer-brand and HR teams tracking employer reputation against competitors. People-analytics folks running employee sentiment analysis over review text. And recruiters or diligence analysts who want workplace ratings for a shortlist of companies without reading five hundred reviews by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;Reading reviews in a browser works until the question becomes quantitative: has work-life balance sentiment moved since the layoffs? Copying reviews into a sheet does not scale past a page or two. Scripting against the site is a fight, since review pages render through JavaScript, pagination hides behind dynamic requests, and anti-bot pressure on Glassdoor is heavier than on most sites. Every layout change resets your progress. This is the category of scraper I least enjoy maintaining, which is exactly why I run it as a service.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Glassdoor scraper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor Reviews API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Paste one or more company review URLs into &lt;code&gt;companyUrls&lt;/code&gt;, set &lt;code&gt;maxReviewsPerCompany&lt;/code&gt; and &lt;code&gt;days&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export the reviews as JSON, CSV, or Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~glassdoor-reviews-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "companyUrls": ["https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"], "maxReviewsPerCompany": 100, "days": 30 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint details: the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull reviews in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/glassdoor-reviews-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyUrls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxReviewsPerCompany&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overallRating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;employmentType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pros&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ready-to-run copy lives in the task &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/glassdoor-reviews-api-python?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor Reviews API in Python&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export reviews to JSON by company URL
&lt;/h2&gt;

&lt;p&gt;The base recipe, one URL in and clean rows out, is the task &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/scrape-glassdoor-reviews-to-json?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Scrape Glassdoor reviews to JSON&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analyze employee sentiment
&lt;/h2&gt;

&lt;p&gt;Feed the &lt;code&gt;pros&lt;/code&gt; and &lt;code&gt;cons&lt;/code&gt; text into your sentiment pipeline or an LLM and score themes over time. The starting point is &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/employee-sentiment-from-glassdoor-reviews?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Employee sentiment from Glassdoor reviews&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break ratings down by category
&lt;/h2&gt;

&lt;p&gt;Work-life, compensation, leadership, and culture arrive as separate numbers per company in the breakdown view: &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/glassdoor-ratings-breakdown-by-category?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor ratings breakdown by category&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark employer reputation
&lt;/h2&gt;

&lt;p&gt;Run several competitors in one input and compare their category ratings side by side, per the task &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/employer-reputation-from-glassdoor?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Employer reputation from Glassdoor&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor new reviews on a schedule
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;days&lt;/code&gt; set to your cadence, each scheduled run collects only the fresh window, which turns the Actor into a review monitoring feed: &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/glassdoor-review-monitoring?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor review monitoring&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read Glassdoor from Claude over MCP
&lt;/h2&gt;

&lt;p&gt;Through the Model Context Protocol, Claude, Claude Code, and Cursor can call the Actor as a tool and summarize live reviews mid-conversation. The config is in the task &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api/examples/glassdoor-reviews-mcp-claude?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Pull Glassdoor reviews in Claude via MCP&lt;/a&gt;, and you can read more about Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping Glassdoor reviews
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is there an official Glassdoor API, or is a scraper the only way?
&lt;/h3&gt;

&lt;p&gt;The old partner API is closed to new applicants, so for review data a scraper is the realistic option. This one behaves like the API you wish existed: documented input, structured output, predictable caps.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the Glassdoor reviews scraper cost?
&lt;/h3&gt;

&lt;p&gt;Billing is per review returned, with no per-run setup fee, and the current per-review price is listed on the Actor's Store page. &lt;code&gt;maxReviewsPerCompany&lt;/code&gt; caps volume and therefore cost before a run starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it legal to run a scraper on Glassdoor reviews?
&lt;/h3&gt;

&lt;p&gt;The Actor collects only publicly visible review pages, nothing behind a login. Whether scraped review data fits your use case commercially is a question for your counsel and jurisdiction, and the honest answer is that norms differ.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude use the Glassdoor scraper through MCP?
&lt;/h3&gt;

&lt;p&gt;Yes. Connect the Apify MCP server and the Actor shows up as a callable tool, so an agent can fetch reviews for a company and reason over the ratings in one exchange.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I schedule the scraper for continuous review monitoring?
&lt;/h3&gt;

&lt;p&gt;Save a task with your company URLs, set &lt;code&gt;days&lt;/code&gt; to match the cadence, and attach an Apify schedule. Each run appends the new window to your dataset. Start from the &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor Reviews API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are the reviews the scraper returns reliable?
&lt;/h3&gt;

&lt;p&gt;They are what Glassdoor shows: anonymous, self-selected, and skewed toward strong feelings, so treat single reviews as anecdotes and aggregates as the signal. Companies with few or no public reviews return few or no rows, and the scraper will not pad the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Employer intelligence pairs well with two neighbors: the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt; covers how a company's products are reviewed, and the &lt;a href="https://apify.com/johnvc/linkedin-company-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;LinkedIn Company API&lt;/a&gt; adds firmographics like size and industry for the same employers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Glassdoor never reopened its API, but the review data is still reachable as clean JSON. Point the &lt;a href="https://apify.com/johnvc/glassdoor-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Glassdoor Reviews API&lt;/a&gt; at a company page and see the breakdown for yourself.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>career</category>
    </item>
    <item>
      <title>Brave Search MCP Without an API Key: Get AI Mode Answers as JSON in 2026</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Sun, 16 Aug 2026 19:47:27 +0000</pubDate>
      <link>https://dev.to/trufflepig/brave-search-mcp-without-an-api-key-get-ai-mode-answers-as-json-in-2026-5d9i</link>
      <guid>https://dev.to/trufflepig/brave-search-mcp-without-an-api-key-get-ai-mode-answers-as-json-in-2026-5d9i</guid>
      <description>&lt;p&gt;AI answers are becoming the search result, and every engine writes its own. &lt;a href="https://search.brave.com/" rel="noopener noreferrer"&gt;Brave Search&lt;/a&gt; is the interesting outlier: an independent index with a privacy-first audience, which means its AI Mode tells users a different story about your brand or topic than the mainstream engines do. I wanted that story as data, so I built the &lt;a href="https://apify.com/johnvc/brave-ai-mode-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Brave AI Mode API&lt;/a&gt; on Apify. Give it a query and it returns the AI-generated answer, the sources it cites, and the supporting web results as one structured JSON record.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doesn't Brave already sell a search API?
&lt;/h2&gt;

&lt;p&gt;Yes, and credit where due: Brave's official Search API is one of the better ones an indie developer can get. But it's built around web results, it runs on API keys and plan quotas, and the AI Mode answer page, the thing users actually read, isn't what it hands you. If your question is "what does Brave's AI say about X, and who does it cite," you need the answer surface itself. This Actor scrapes exactly that and packages it like an API: query in, answer plus citations out, no Brave key to provision or babysit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Brave AI Mode API returns
&lt;/h2&gt;

&lt;p&gt;The Brave AI Mode API returns one record per query: the AI-generated answer text, the references it cites, and the supporting web results when present.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Query&lt;/td&gt;
&lt;td&gt;&lt;code&gt;what is quantum computing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The question you asked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI answer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Quantum computing uses...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full answer text as generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cited references&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[{title, url}, ...]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The sources the answer leans on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supporting web results&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[{title, url, snippet}, ...]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The organic results beneath the answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Country&lt;/td&gt;
&lt;td&gt;&lt;code&gt;us&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Storefront of the search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;&lt;code&gt;en&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interface language&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One row holds the whole answer surface, which makes diffing runs over time straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Three audiences, in my experience. Marketing and SEO teams doing generative-engine monitoring, who need to know what AI answers claim about their brand and which domains get cited. Researchers and journalists who care specifically about the privacy-search ecosystem and its independent index. And agent builders who want an AI-grounded search tool without managing another vendor key.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;You could check AI Mode by hand: type the query, read the answer, screenshot it, repeat next week. That survives about five keywords. Automating it yourself means a headless browser, because the answer streams in with JavaScript, plus session handling and markup that changes as Brave iterates on a young product. The iteration speed is the killer; new AI surfaces get redesigned monthly, and every redesign eats your selectors. I'd rather maintain that parser once, centrally, than have every reader maintain their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Brave AI Mode API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/brave-ai-mode-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Brave AI Mode API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Enter a &lt;code&gt;query&lt;/code&gt;, or a &lt;code&gt;queries&lt;/code&gt; list for batches, plus optional &lt;code&gt;country&lt;/code&gt; and &lt;code&gt;language&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and download the answers as JSON or CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~brave-ai-mode-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "query": "what is quantum computing", "country": "us", "language": "en" }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run and dataset endpoints are described in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull AI answers in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/brave-ai-mode-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;best password manager&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is vpn worth it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI Mode answers show up for informational, question-style searches, so phrase your queries the way a user asking a question would.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Brave Search API alternative for AI answers
&lt;/h2&gt;

&lt;p&gt;The task &lt;a href="https://apify.com/johnvc/brave-ai-mode-api/examples/brave-search-api-alternative-ai-answers-as-json?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Brave Search API alternative: AI answers as JSON&lt;/a&gt; frames the core trade: no key signup, no plan tiers, just per-query billing for the answer surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check many keywords in one run
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/brave-ai-mode-api/examples/check-brave-ai-answers-for-many-keywords?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Check Brave AI answers for many keywords&lt;/a&gt; uses the &lt;code&gt;queries&lt;/code&gt; array for batch monitoring, the shape you want for a keyword portfolio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track your brand in AI answers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/brave-ai-mode-api/examples/track-brand-mentions-in-brave-ai-search-answers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Track brand mentions in Brave AI search answers&lt;/a&gt; is the generative-engine-optimization play: run your brand queries on a schedule and watch how the answer's framing shifts.&lt;/p&gt;

&lt;h2&gt;
  
  
  See who gets cited
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/brave-ai-mode-api/examples/track-sources-cited-in-brave-ai-answers?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Track sources cited in Brave AI answers&lt;/a&gt; inverts the question: which domains does Brave's AI trust for your topic, and is yours among them? Citation share is the new ranking, and this is how you measure it on Brave.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spreadsheet route
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/johnvc/brave-ai-mode-api/examples/export-brave-ai-answers-to-csv?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Export Brave AI answers to CSV&lt;/a&gt; runs entirely in the Console for the no-code crowd.&lt;/p&gt;

&lt;h2&gt;
  
  
  Brave Search MCP, without an API key
&lt;/h2&gt;

&lt;p&gt;This is the setup I use most. Registered through Apify's MCP server, the Actor becomes a tool that Claude, Claude Code, and Cursor can call, so your agent can consult Brave's AI Mode mid-conversation with no Brave key involved. The task &lt;a href="https://apify.com/johnvc/brave-ai-mode-api/examples/brave-search-ai-for-claude-via-mcp-no-api-key?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Brave Search AI for Claude via MCP, no API key&lt;/a&gt; walks through the config, and there's more on Claude itself at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about the Brave AI Mode scraper
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does the Brave AI scraper cost per query?
&lt;/h3&gt;

&lt;p&gt;A cent and a half per query resolved, covering the answer, its citations, and the supporting results in one record. There's no subscription, and the free credit on a new Apify account funds a decent first monitoring batch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why use this scraper instead of the official Brave Search API?
&lt;/h3&gt;

&lt;p&gt;Different artifact. The official API serves web results under key-and-quota plans; this scraper captures the AI Mode answer surface, citations included, which is the thing GEO monitoring actually measures. Plenty of projects sensibly use both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude Code call the Brave scraper as a tool?
&lt;/h3&gt;

&lt;p&gt;Yes. Over MCP it works from Claude, Claude Code, and Cursor alike, and the no-API-key task above is the fastest path to a working setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I schedule this scraper for weekly answer tracking?
&lt;/h3&gt;

&lt;p&gt;Save your keyword batch as a task, attach an Apify schedule, and each run appends a dated snapshot you can diff for changed answers or lost citations. Start from the &lt;a href="https://apify.com/johnvc/brave-ai-mode-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Brave AI Mode API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the limits of an AI answer scraper?
&lt;/h3&gt;

&lt;p&gt;AI Mode doesn't fire on every query; navigational and transactional searches often return no answer, and that's data too. Answers are also generated fresh, so expect wording variation between runs even when the substance holds. Track claims and citations rather than exact strings.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;The same monitoring pattern works on other engines' AI surfaces: the &lt;a href="https://apify.com/johnvc/Google-AI-Overview-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google AI Overview API&lt;/a&gt; for Google's answer box, the &lt;a href="https://apify.com/johnvc/bing-copilot-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Bing Copilot API&lt;/a&gt; for Microsoft's, and the &lt;a href="https://apify.com/johnvc/naver-ai-overview-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Naver AI Overview API&lt;/a&gt; for Korea's leading engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;What Brave's AI says about your topic is already influencing users; the only question is whether you're reading it as data. The &lt;a href="https://apify.com/johnvc/brave-ai-mode-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Brave AI Mode API&lt;/a&gt; makes that a one-query experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webscraping</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>API Discovery in 2026: Scrape the RapidAPI Marketplace into One Sortable Dataset</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Sun, 16 Aug 2026 08:10:25 +0000</pubDate>
      <link>https://dev.to/trufflepig/api-discovery-in-2026-scrape-the-rapidapi-marketplace-into-one-sortable-dataset-4176</link>
      <guid>https://dev.to/trufflepig/api-discovery-in-2026-scrape-the-rapidapi-marketplace-into-one-sortable-dataset-4176</guid>
      <description>&lt;p&gt;Picking an API off &lt;a href="https://rapidapi.com/hub" rel="noopener noreferrer"&gt;RapidAPI Hub&lt;/a&gt; usually means thirty open tabs and a homemade spreadsheet: pricing on one tab, latency stats on another, ratings on a third, and no way to sort any of it. The catalog is public, but there is no export. This post shows how I turn that whole marketplace into structured data with the &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;RapidAPI Marketplace API&lt;/a&gt; on Apify, one JSON row per listing.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does RapidAPI have an API for its own catalog?
&lt;/h2&gt;

&lt;p&gt;Here is the small irony: the biggest API marketplace does not offer a public API for searching its own listings. You can subscribe to any API on the hub, but there is no documented endpoint that returns "every weather API with its pricing model, popularity score, and latency" as data. For api discovery at any real scale, that leaves scraping the public catalog, which is exactly what this Actor packages: a search box you call programmatically, no RapidAPI account or key required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the RapidAPI Marketplace API returns
&lt;/h2&gt;

&lt;p&gt;The RapidAPI Marketplace API returns public API listings as flat JSON records with pricing model, category, popularity, reliability metrics, publisher, and, in detailed mode, billing plans and ratings.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Open Weather Map&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;With &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, and the listing &lt;code&gt;url&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pricing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FREEMIUM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FREE, FREEMIUM, or PAID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;popularityScore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RapidAPI's 0 to 10 score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;avgLatency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;142&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Milliseconds, with &lt;code&gt;avgSuccessRate&lt;/code&gt; alongside&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;billingPlans&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": "Pro", "price": 10, "quota": "600 requests/minute" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subscriptionsCount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;84213&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed mode, with &lt;code&gt;ratingScore&lt;/code&gt; and &lt;code&gt;ratingVotes&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Basic search rows carry the core fields; flip &lt;code&gt;detailedInfo&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and each listing adds billing plans, subscriber counts, ratings, and the publisher's readme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Developers doing api discovery who want to shortlist candidates on data instead of marketing pages. Product and research folks sizing a category, say, how many paid sentiment-analysis APIs exist and what they charge. And API publishers watching their own niche: who entered, what they price, how their popularity moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;The DIY approach is to browse the hub and copy listings into a sheet, or script against the site directly. Copying breaks at about the tenth listing, when you realize the billing plans live two clicks deep on every page. Scripting breaks differently: the catalog renders through JavaScript, pagination is stateful, and the markup is not something anyone promises to keep stable. I built the tab-and-spreadsheet version myself before this Actor existed, which is a big part of why this Actor exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the RapidAPI scraper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;RapidAPI Marketplace API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Add one or more &lt;code&gt;searchTerms&lt;/code&gt;, set &lt;code&gt;maxResults&lt;/code&gt;, and optionally enable &lt;code&gt;detailedInfo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export the dataset as JSON, CSV, or Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~rapidapi-marketplace-api/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "searchTerms": ["weather"], "maxResults": 25, "detailedInfo": true }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint reference: the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shortlist APIs in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/rapidapi-marketplace-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchTerms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pricing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;popularityScore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avgLatency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sort by &lt;code&gt;popularityScore&lt;/code&gt; and you have a defensible shortlist in one run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare every API in a category
&lt;/h2&gt;

&lt;p&gt;The Actor ships with dozens of ready-made comparison tasks, one per category, so you can start from a preconfigured run instead of a blank input. &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/compare-crypto-apis-on-rapidapi-marketplace?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Compare crypto APIs&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/compare-news-apis-on-rapidapi?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;compare news APIs&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/compare-linkedin-apis-on-rapidapi?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;compare LinkedIn APIs&lt;/a&gt; each pull a full category with pricing and reliability side by side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rank listings by rating, price, or popularity
&lt;/h2&gt;

&lt;p&gt;Because every row carries scores and plans, sorting is a one-liner. The tasks &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-ocr-apis-on-rapidapi-by-rating?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;find OCR APIs by rating&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-pdf-apis-on-rapidapi-by-price?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;find PDF APIs by price&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-rapidapi-popular-apis-by-popularity-score?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;find the most popular APIs by popularity score&lt;/a&gt; show the pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scan a niche in one run
&lt;/h2&gt;

&lt;p&gt;Niche scans work the same way for any keyword: &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-ai-apis-on-rapidapi?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;AI APIs&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-weather-apis-on-rapidapi?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;weather APIs&lt;/a&gt;, &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-free-apis-on-rapidapi?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;free APIs&lt;/a&gt;, and &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api/examples/find-web-scraping-apis-on-rapidapi-by-popularity?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;web scraping APIs by popularity&lt;/a&gt; are all one-click starts, and the Actor's examples tab lists the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let Claude do the API shopping over MCP
&lt;/h2&gt;

&lt;p&gt;Connected through the Model Context Protocol, the Actor becomes a tool that Claude, Claude Code, or Cursor can call, so "find me a freemium geocoding API with good reliability" turns into a live catalog query with real numbers behind the answer. You can read more about Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping RapidAPI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does the RapidAPI scraper cost to run?
&lt;/h3&gt;

&lt;p&gt;It is priced as a loss leader: 0.0001 dollars per listing returned, basic or detailed, with no start fee. A 500-listing category scan costs five cents, and you only pay for rows actually delivered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it legal to run a scraper against RapidAPI listings?
&lt;/h3&gt;

&lt;p&gt;The Actor collects only public marketplace listings, the same information any visitor sees, with no login and no paywalled content. As with any scraped source, check your own use case and jurisdiction before building on it commercially.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an AI agent use this scraper through MCP?
&lt;/h3&gt;

&lt;p&gt;Yes. Expose it through the Apify MCP server and any MCP client, Claude included, can search the catalog as a tool call and reason over pricing and reliability fields in the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I schedule the scraper to track a niche over time?
&lt;/h3&gt;

&lt;p&gt;You can, and it is the best way to catch new entrants and price changes. Save a task for your category, attach an Apify schedule, and diff the runs. Start from the &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;RapidAPI Marketplace API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What will this scraper not give me?
&lt;/h3&gt;

&lt;p&gt;Anything behind a login or a subscription: no private APIs, no per-endpoint request consoles, no usage data beyond what listings publish. The &lt;code&gt;readme&lt;/code&gt; field also only arrives in detailed mode, so basic rows stay lean by design.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;Marketplace intelligence generalizes. The &lt;a href="https://apify.com/johnvc/store-actor-intelligence-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apify Store API&lt;/a&gt; does the same job for Apify's Actor catalog, &lt;a href="https://apify.com/johnvc/apple-app-store-search?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Apple App Store Search&lt;/a&gt; covers app marketplaces, and the &lt;a href="https://apify.com/johnvc/g2-reviews-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;G2 Reviews API&lt;/a&gt; adds review data for the vendors you find.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;API discovery should be a query, not an afternoon of tabs. Point the &lt;a href="https://apify.com/johnvc/rapidapi-marketplace-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;RapidAPI Marketplace API&lt;/a&gt; at your category and get the whole field as one sortable dataset.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Yelp Business API: How to Get Full Business Profiles as JSON in 2026</title>
      <dc:creator>Truffle Pig Data</dc:creator>
      <pubDate>Sat, 15 Aug 2026 19:09:05 +0000</pubDate>
      <link>https://dev.to/trufflepig/yelp-business-api-how-to-get-full-business-profiles-as-json-in-2026-4b83</link>
      <guid>https://dev.to/trufflepig/yelp-business-api-how-to-get-full-business-profiles-as-json-in-2026-4b83</guid>
      <description>&lt;p&gt;A &lt;a href="https://www.yelp.com" rel="noopener noreferrer"&gt;Yelp&lt;/a&gt; business page holds more structured detail than almost any other local source: hours, amenities, price tier, popular dishes, review highlights, sometimes a full menu. Getting that detail out programmatically is the annoying part, since the official developer offering trims most of it away. Here is the manual route, its limits, and the shortcut: the &lt;a href="https://apify.com/johnvc/Yelp-Place-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Yelp Business API&lt;/a&gt; on Apify, which takes a place ID and returns the full profile as JSON.&lt;/p&gt;

&lt;p&gt;Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does Yelp have an API?
&lt;/h2&gt;

&lt;p&gt;It does: Yelp Fusion, and for a search box in an app it is a fine choice. For data work it gets cramped fast. You need an API key, daily call limits apply, and the responses are slimmed down compared with what the public business page shows. Full menus, amenity lists, popular dishes, and review highlights are the kind of page-level detail the official response does not carry. A scraper-as-API closes that gap: the same public page, returned whole, as one JSON item per business.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Yelp Business API returns
&lt;/h2&gt;

&lt;p&gt;The Yelp Business API returns a complete business profile per place ID: name, rating, review count, price, contact details, hours, amenities, and popular dishes as structured JSON.&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;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;place_results.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Maman&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;With &lt;code&gt;categories&lt;/code&gt; and &lt;code&gt;neighborhoods&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plus &lt;code&gt;reviews&lt;/code&gt; count, here &lt;code&gt;847&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;price&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yelp's price tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;operation_hours&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "day": "Mon", "hours": "7:30 AM - 6:00 PM" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per weekday&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;features&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "title": "Offers Delivery", "is_active": true }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Amenities as structured flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;popular_items&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "title": "Almond Croissant", "reviews": 28 }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dishes with mention counts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Set &lt;code&gt;full_menu&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and menu sections arrive in &lt;code&gt;full_menu_results&lt;/code&gt; when the business publishes one on Yelp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Teams building competitor profiles who want ratings and amenities across every rival in a neighborhood. Data folks enriching a lead list, turning bare business names into records with phone, website, and hours. And restaurant-tech builders who need menus and popular dishes as data rather than screenshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way, and where it breaks
&lt;/h2&gt;

&lt;p&gt;By hand, you open each business page and copy fields into a sheet, which holds up for about ten businesses and then collapses. Scripting it directly is harder than it looks: the page is JavaScript-heavy, anti-bot measures are real, and the interesting details sit in different page fragments that load separately. Keeping selectors alive across Yelp's layout updates becomes a part-time job. I would rather not have that job, which is roughly the origin story of this Actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: run the Yelp business scraper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apify Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/johnvc/Yelp-Place-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Yelp Business API&lt;/a&gt; and click Try for free.&lt;/li&gt;
&lt;li&gt;Paste one or more &lt;code&gt;place_ids&lt;/code&gt;, the slug from any Yelp business URL, like &lt;code&gt;maman-new-york-22&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run it and export the dataset as JSON, CSV, or Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/johnvc~Yelp-Place-API/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "place_ids": ["maman-new-york-22"], "full_menu": false }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The run lifecycle is in the &lt;a href="https://docs.apify.com/api/v2" rel="noopener noreferrer"&gt;Apify API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Profile businesses in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;johnvc/Yelp-Place-API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;place_ids&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maman-new-york-22&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;place&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;place_results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviews&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One item per place ID, so batching fifty competitors is just a longer list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get one business profile by ID
&lt;/h2&gt;

&lt;p&gt;The minimal case, one ID in and one full profile out, lives in the task &lt;a href="https://apify.com/johnvc/yelp-place-api/examples/get-a-yelp-business-profile-by-id-via-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get a Yelp business profile by ID&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enrich a list of businesses in bulk
&lt;/h2&gt;

&lt;p&gt;Feed a whole column of place IDs and get back a dataset with phone, website, hours, and ratings per row: &lt;a href="https://apify.com/johnvc/yelp-place-api/examples/enrich-yelp-business-listings-in-bulk?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Enrich Yelp business listings in bulk&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extract a restaurant's full menu
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;full_menu&lt;/code&gt; enabled, menu sections and items come back as data. The task &lt;a href="https://apify.com/johnvc/yelp-place-api/examples/extract-a-restaurant-s-full-menu-from-yelp?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Extract a restaurant's full menu from Yelp&lt;/a&gt; shows the exact input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check a health inspection score
&lt;/h2&gt;

&lt;p&gt;Where Yelp displays a health inspection result for a business, the profile carries it, and the task &lt;a href="https://apify.com/johnvc/yelp-place-api/examples/get-yelp-health-inspection-score-by-place-id?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Get a Yelp health inspection score by place ID&lt;/a&gt; pulls that signal on demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track competitor ratings and amenities
&lt;/h2&gt;

&lt;p&gt;Run the same ID list on a schedule and diff the output over time, which is the whole competitor-profiles recipe: &lt;a href="https://apify.com/johnvc/yelp-place-api/examples/track-yelp-competitor-ratings-and-amenities?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Track Yelp competitor ratings and amenities&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wire it into Claude over MCP
&lt;/h2&gt;

&lt;p&gt;Through the Apify MCP server, the Actor becomes a tool that Claude, Claude Code, and Cursor can call directly, so "pull the profile for maman-new-york-22 and summarize the amenities" runs a live fetch instead of relying on memory. More on Claude at &lt;a href="https://claude.ai/referral/uIlpa7nPLg" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ about scraping Yelp business data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does the Yelp business scraper cost per profile?
&lt;/h3&gt;

&lt;p&gt;Pricing is per event: $0.02 to start a run and $0.02 per place processed. One business is about $0.04, ten in a batch about $0.22, and new Apify accounts include free platform credit to start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where does the scraper get its place IDs?
&lt;/h3&gt;

&lt;p&gt;From any Yelp business URL: the slug after &lt;code&gt;/biz/&lt;/code&gt; is the ID. For discovery at scale, a companion search Actor returns IDs by term and location, which you then feed into this one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can the scraper return business hours and amenities?
&lt;/h3&gt;

&lt;p&gt;Yes, both. Hours arrive per weekday in &lt;code&gt;operation_hours&lt;/code&gt;, and amenities come back as structured &lt;code&gt;features&lt;/code&gt; flags like "Offers Delivery" with an active state, which makes filtering trivial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude call this Yelp scraper through MCP?
&lt;/h3&gt;

&lt;p&gt;It can. Connect the Apify MCP server and the Actor appears as a callable tool in Claude, Claude Code, Cursor, and other MCP clients, with results returned into the conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I schedule the scraper to watch competitors?
&lt;/h3&gt;

&lt;p&gt;Save your ID list as a task, attach an Apify schedule, and each run appends timestamped profiles you can diff for rating and amenity changes. Start from the &lt;a href="https://apify.com/johnvc/Yelp-Place-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Yelp Business API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What will the scraper miss?
&lt;/h3&gt;

&lt;p&gt;Anything the public page does not show. Menus only come back when a business publishes one on Yelp, some profiles lack phones or websites, and a requested menu that does not exist returns a profile with &lt;code&gt;menu_returned&lt;/code&gt; set to false rather than invented data.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from Truffle Pig Data
&lt;/h2&gt;

&lt;p&gt;This Actor is the middle of a three-stage suite: the &lt;a href="https://apify.com/johnvc/yelp-search-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Yelp Search API&lt;/a&gt; finds place IDs by term and location, this one profiles them, and the &lt;a href="https://apify.com/johnvc/Yelp-Reviews-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Yelp Reviews API&lt;/a&gt; pulls the full review text. For a second opinion on the same businesses, cross-reference with the &lt;a href="https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Google Maps Places API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Yelp's business pages are dense with data that the official API never hands over. Feed a place ID to the &lt;a href="https://apify.com/johnvc/Yelp-Place-API?fpr=9n7kx3&amp;amp;fp_sid=devto" rel="noopener noreferrer"&gt;Yelp Business API&lt;/a&gt; and get the whole profile back as JSON.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>api</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
