Investigative journalists need bulk Google Reviews to surface patterns (fake reviews, review bombing, wage theft complaints). Google's official API caps at 5 reviews per place. This tutorial uses Scavio's Maps/Places search to pull thousands of reviews per business at journalism scale.
Prerequisites
- Python 3.10+
- A Scavio API key
- A list of target business names or place IDs
- pandas for analysis
Walkthrough
Step 1: Find the place ID
Scavio Maps search returns place_id for each business.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def find_place(name):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google_maps', 'query': name})
return r.json().get('local_results', [{}])[0].get('place_id')Step 2: Pull reviews by place_id
Paginate through all reviews.
def reviews(place_id, max_pages=10):
all_reviews, token = [], None
for _ in range(max_pages):
body = {'platform': 'google_reviews', 'query': place_id}
if token: body['next_token'] = token
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json=body).json()
all_reviews += r.get('reviews', [])
token = r.get('next_token')
if not token: break
return all_reviewsStep 3: Store in pandas
One row per review for analysis.
import pandas as pd
def to_df(reviews):
return pd.DataFrame(reviews)[['author', 'rating', 'date', 'text']]Step 4: Run pattern analysis
Frequent keywords, rating distributions, velocity bursts.
def burst_days(df):
return df.groupby('date').size().sort_values(ascending=False).head(10)Step 5: Export for the newsroom
CSV for editors, markdown excerpts for quotes.
def export(df, business):
df.to_csv(f'reviews_{business}.csv', index=False)Python Example
import os, requests, pandas as pd
API_KEY = os.environ['SCAVIO_API_KEY']
def pull(business):
pid = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google_maps', 'query': business}).json()['local_results'][0]['place_id']
revs = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google_reviews', 'query': pid}).json().get('reviews', [])
return pd.DataFrame(revs)
print(pull('Joe Coffee Brooklyn').head())JavaScript Example
const API_KEY = process.env.SCAVIO_API_KEY;
async function pull(business) {
const mapR = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'google_maps', query: business })
});
const pid = (await mapR.json()).local_results[0].place_id;
const revR = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'google_reviews', query: pid })
});
return (await revR.json()).reviews;
}Expected Output
Thousands of reviews per business in minutes. Pandas dataframe with date, rating, author, text. Ready for burst-day detection and keyword analysis.