<?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: Cagdas Salur</title>
    <description>The latest articles on DEV Community by Cagdas Salur (@cagdassalur).</description>
    <link>https://dev.to/cagdassalur</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%2F4170469%2F65d7f754-8356-4de5-87d7-2a37b4f8777f.jpg</url>
      <title>DEV Community: Cagdas Salur</title>
      <link>https://dev.to/cagdassalur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cagdassalur"/>
    <language>en</language>
    <item>
      <title>Introducing Review Audit: An open-source tool to check how real a Google Maps rating is</title>
      <dc:creator>Cagdas Salur</dc:creator>
      <pubDate>Sun, 11 Oct 2026 21:37:48 +0000</pubDate>
      <link>https://dev.to/serpapi/introducing-review-audit-an-open-source-tool-to-check-how-real-a-google-maps-rating-is-2p65</link>
      <guid>https://dev.to/serpapi/introducing-review-audit-an-open-source-tool-to-check-how-real-a-google-maps-rating-is-2p65</guid>
      <description>&lt;p&gt;Review Audit reads a Google Maps place's newest reviews, pulls the full Google history of the reviewers worth a closer look, and tells you how much of the rating the place's own reviewers can explain. What they can't explain gets set aside, and you see the rating without it. It is open source, runs on your machine with your own SerpApi key, and costs about 42 credits a place.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/serpapi/reviewaudit" rel="noopener noreferrer"&gt;GitHub - serpapi/reviewaudit: Is this 4.8 real? Reads a Google Maps place’s newest reviews through SerpApi and shows the patterns worth a closer look: first-time reviewers, five-star bursts, reviews posted minutes apart. Runs locally on your own API key.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What an audit looks like
&lt;/h2&gt;

&lt;p&gt;Each place you read gets one page: the verdict, the rating without the reviews it can't explain, and the evidence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56wgtcwoyqb7rnxrqgvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56wgtcwoyqb7rnxrqgvu.png" alt="An audit of Gull Rock Dinner Cruise, an invented place from the demo" width="800" height="1094"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;An audit of Gull Rock Dinner Cruise, an invented place from the demo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every place in these screenshots is invented. Review Audit ships a demo that puts made-up businesses with made-up reviews on real Portland, Maine streets, so the images show the real tool without pointing at a real business. More on that at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you can't spot a fake review by reading it
&lt;/h2&gt;

&lt;p&gt;Every business with a rating has an incentive to improve it, and there is a market that will help. On the place page, a review that was paid for or asked for looks exactly like a real one: five stars, a name, a date.&lt;/p&gt;

&lt;p&gt;They don't look the same in aggregate. Padded reviews tend to come from accounts that have never reviewed anything else. They arrive together, in office hours, minutes apart. They say the same thing in the same words. None of that is visible from one review, and all of it is visible from 200 of them plus the history of the people who wrote them. That is what Review Audit reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks for
&lt;/h2&gt;

&lt;p&gt;Each pattern is measured against the place itself, not against a global rule. A busy lunch spot that gets 30 reviews on a Saturday is not suspicious; a dentist that gets 30 in a week when its normal week is four is.&lt;/p&gt;

&lt;h3&gt;
  
  
  First-time reviewers
&lt;/h3&gt;

&lt;p&gt;Reviewers with no record like it more than anyone else. Review Audit compares how often first-time accounts give five stars against accounts with 4 to 50 reviews, at the same place. The gap is the finding, not the count. A famous place gets plenty of first reviews; a place where first reviews are five stars far more often than everyone else's has something to explain.&lt;/p&gt;

&lt;h3&gt;
  
  
  A week with too many five-star reviews
&lt;/h3&gt;

&lt;p&gt;A week carried far more five-star reviews than the place gets. Judged against the place's own median week, and flagged only when it is both at least 2.5 times normal and very unlikely by chance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Five-star reviews minutes apart
&lt;/h3&gt;

&lt;p&gt;Five-star reviews arrive in batches, minutes apart. More pairs within ten minutes than the hours people actually post at would predict, so a lunch rush is not mistaken for a batch upload.&lt;/p&gt;

&lt;h3&gt;
  
  
  The same waiter, over and over
&lt;/h3&gt;

&lt;p&gt;Reviews that name the same member of staff, posted in pairs after dinner by people with the same surname, are a different kind of padding: reviews asked for at the table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repeated wording and shared reviewers
&lt;/h3&gt;

&lt;p&gt;Reviews that say the same thing in the same words, and groups of accounts that keep reviewing the same places. Two accounts that share other places are usually a couple. Review Audit needs three.&lt;/p&gt;

&lt;h3&gt;
  
  
  Almost no four-star reviews
&lt;/h3&gt;

&lt;p&gt;Nobody ever gives it four stars. Real places collect a four-star tail: the customer who enjoyed it but waited too long. A wall of fives with nothing beside it means someone is choosing who gets asked.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does with what it finds
&lt;/h3&gt;

&lt;p&gt;None of these condemns a single review on its own. What gets set aside is only the excess over what the place's own reviewers explain, and every review set aside is listed with a link back to Google, so you can disagree.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ckebum0qyeusj05g1pz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ckebum0qyeusj05g1pz.png" alt="The audits so far, most padded first" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The audits so far, most padded first&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the reviews say
&lt;/h2&gt;

&lt;p&gt;Below the findings, each audit also reads the reviews for what they say: what people praise and what they complain about, food/service/atmosphere sub-ratings with and without the set-aside reviews, the hours people post at, where else the reviewers go, and how often the owner replies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3d6twv6rzt0urjd1duuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3d6twv6rzt0urjd1duuj.png" alt="What the reviews say: praise, complaints, sub-ratings and the hours people post at" width="800" height="1601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What the reviews say: praise, complaints, sub-ratings and the hours people post at&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each audit is a single self-contained HTML file, so it can be kept, compared and shared.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in 5 minutes
&lt;/h2&gt;

&lt;p&gt;To install Review Audit, you can use &lt;code&gt;uv tool install&lt;/code&gt; command as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/serpapi/reviewaudit
reviewaudit serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That opens the app. Paste your key from &lt;a href="https://serpapi.com/manage-api-key" rel="noopener noreferrer"&gt;serpapi.com/manage-api-key&lt;/a&gt;, search for a place, and press &lt;strong&gt;Read the reviews&lt;/strong&gt;. The free plan's 250 searches a month read about five places.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fysvmagbotwzclbj6azrx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fysvmagbotwzclbj6azrx.png" alt="Searching Google Maps from the app" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Searching Google Maps from the app&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The read runs in the background and shows each stage, so you can watch where the credits go:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkapjgk91s7qwsqcoornw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkapjgk91s7qwsqcoornw.png" alt="A read in progress, one stage at a time" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A read in progress, one stage at a time&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is a CLI too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SERPAPI_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
reviewaudit &lt;span class="s2"&gt;"&amp;lt;place name&amp;gt; &amp;lt;city&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it uses SerpApi
&lt;/h2&gt;

&lt;p&gt;Three SerpApi engines, about 42 calls:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;step&lt;/th&gt;
&lt;th&gt;engine&lt;/th&gt;
&lt;th&gt;what it gives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://serpapi.com/google-maps-api" rel="noopener noreferrer"&gt;Google Maps API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the place, its photo, hours and Google's lifetime star counts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://serpapi.com/google-maps-reviews-api" rel="noopener noreferrer"&gt;Google Maps Reviews API&lt;/a&gt; ×10&lt;/td&gt;
&lt;td&gt;the 200 newest reviews, each with the reviewer's review count, Local Guide status, photos, sub-ratings and an exact timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://serpapi.com/google-maps-contributor-reviews-api" rel="noopener noreferrer"&gt;Google Maps Contributor Reviews API&lt;/a&gt; ×30&lt;/td&gt;
&lt;td&gt;everything the reviewers worth checking have ever reviewed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cheap checks run first, so the 30 paid record lookups go to the reviewers they point at. Every response is cached, so re-reading a place or rebuilding its page costs nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you build on these APIs yourself
&lt;/h3&gt;

&lt;p&gt;A few things worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The contributor engine returns relative dates only ("a week ago"); the reviews engine has &lt;code&gt;iso_date&lt;/code&gt;. So timing patterns come from the place's reviews, and a reviewer's record is used for &lt;em&gt;what&lt;/em&gt; they reviewed, not when.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user.reviews&lt;/code&gt; on a review counts written reviews. The full record also has rating-only entries, so an account that says "1 review" can have 19 ratings behind it. Review Audit trusts the record.&lt;/li&gt;
&lt;li&gt;The first page of reviews is 8, the rest 20.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it can't tell you
&lt;/h2&gt;

&lt;p&gt;It reports patterns worth a closer look, not verdicts on individual reviews, which is why every verdict reads "looks". It also has blind spots, and each audit prints them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A place where everyone gives five stars looks the same whether they mean it or not. A flat 95% is not evidence; the gradient across account depth is.&lt;/li&gt;
&lt;li&gt;A first review at a famous place is normal. A thin account alone never counts.&lt;/li&gt;
&lt;li&gt;Hotels carry Tripadvisor and Trip.com reviews with no Google account behind them. Those are left out, and the page says how many.&lt;/li&gt;
&lt;li&gt;200 reviews at a very busy place can be two weeks. The audit says so when the window is short, and &lt;code&gt;--reviews 600&lt;/code&gt; reads further back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About those screenshots
&lt;/h2&gt;

&lt;p&gt;Running a tool like this against real businesses and publishing the results is a different thing from building it. So the repo includes &lt;code&gt;tools/demo.py&lt;/code&gt;: a fake Google Maps that answers the same three engines in the same shapes, for businesses that don't exist (every name was checked against Google Maps) on real Portland streets, with invented reviews and reviewers. The padding is written in on purpose, a burst here, a waiter named over and over there, and the real Review Audit finds it. Every image in the &lt;code&gt;README&lt;/code&gt; file and in this post comes from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the code
&lt;/h2&gt;

&lt;p&gt;The code is on &lt;a href="https://github.com/serpapi/reviewaudit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Issues and pull requests are welcome, especially new patterns with a rationale behind them, and staff-name and stop-word lists for languages beyond English and Turkish.&lt;/p&gt;

&lt;p&gt;If you don't have a key yet, &lt;a href="https://serpapi.com/users/sign_up" rel="noopener noreferrer"&gt;the free plan&lt;/a&gt; is 250 searches a month, enough for about five places.&lt;/p&gt;

</description>
      <category>analysis</category>
      <category>github</category>
      <category>opensource</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
