Every location you manage has its own rating, and the brand-level average hides most of what it is made of. One site can drift down for a month before anyone notices, while another sits on a pile of reviews nobody has answered. Google Business Profile will tell you some of this, for the listings you have verified, on one platform. Trustpilot and Tripadvisor are somewhere else entirely, and so is every competitor you get benchmarked against. This use case walks through how a local SEO or reputation tool team can pull all three into one monitor, using our Business Data Reviews API for the data.
The problem: three platforms, three identifiers, and nothing to poll
Checking by hand works for one location. At twenty sites across three platforms, that’s about sixty pages to open every morning, most of them showing reviews someone already read last week. The one that matters, posted four hours ago, is three scrolls down.
So the instinct is to build the collection layer yourself. That turns into three separate scrapers, because each platform identifies a business differently and changes its markup on its own schedule. Google works from a cid or a place_id, Trustpilot from a domain, Tripadvisor from a URL path. Maintaining one parser is a chore. Maintaining three is a small permanent job nobody asked for.
A monitor needs less than a scraper, though. It needs a stable identifier for every location on every platform, a scheduled pull, and a single response shape to parse. Our Business Data Reviews API covers the collection side, which leaves the identifiers and the schedule as the parts you design.
What monitoring reviews actually mean
It helps to split “monitor our reviews” into three smaller questions first. Each one maps to a single endpoint.
- Where does the rating stand, and how is it distributed? The Business Data Google My Business Info endpoint returns the listing’s current
ratingalongsiderating_distribution. For Honest Burgers Covent Garden that came back as 2,653 five-star reviews against 152 one-star. The 4.4 average on its own does not tell you that. - What did customers say, and when? The Business Data Google Reviews endpoint returns the review stream itself. The Trustpilot and Tripadvisor equivalents take the same request shape and give back the same response shape.
- Which reviews went unanswered? Every review item carries an
owner_answerfield. Where it comes back null, nobody has replied, and that list is something an account manager can work through the same afternoon.
Endpoints used in this workflow:
- Google My Business Info: listing details, current rating, rating distribution.
- Google Reviews: the review stream for one establishment, by
cid,place_id, orkeyword. - Trustpilot Reviews: Trustpilot reviews by domain.
- Tripadvisor Reviews: Tripadvisor reviews by URL path.
The use case: a daily review monitor for a multi-location brand
You can run this for one brand every morning, one task per location per platform.
Step 1. Pin every location to a stable identifier, once. Google reviews can be requested by keyword, but keyword targeting is fragile for chains: “Honest Burgers” in London matches ten branches, and which one you get back depends on how Google ranks them that day. Look up each site’s cid or place_id once instead, and store it beside your internal location record. Our Help Center article on cid, place_id and feature_id explains where each identifier comes from. Trustpilot wants the brand domain, Tripadvisor the url_path from the establishment’s Tripadvisor URL.
Step 2. Post one task per location. The request below goes to the Google Reviews endpoint and requests the ten newest reviews for a single branch. Setting the sort_by parameter to newest matters here. The default value is relevant, which is fine for display and useless for monitoring, because a review posted an hour ago can sit below one from 2023. The tag field carries your internal location ID through to the response, so results match back without a lookup table.
Request example:
[
{
"cid": "18034889698101052014",
"location_name": "London,England,United Kingdom",
"language_name": "English",
"depth": 10,
"sort_by": "newest",
"tag": "loc_covent_garden"
}
]
Endpoint used: https://api.dataforseo.com/v3/business_data/google/reviews/task_post
Step 3. Collect the results. Task-based endpoints do not hand back the data in the same call. Set a pingback_url or postback_url when you post the task and the result comes to you once it is ready, which fits a scheduled job better than polling on a timer. The Tasks Ready list is there if you would rather check status yourself. Our Help Center covers pingbacks and postbacks in detail.
Response example (three of the ten review items shown):
{
"version": "0.1.20260917",
"status_code": 20000,
"status_message": "Ok.",
"time": "0.0218 sec.",
"cost": 0,
"tasks_count": 1,
"tasks_error": 0,
"tasks": [
{
"id": "09221402-1535-0298-0000-be12fe4b9499",
"status_code": 20000,
"status_message": "Ok.",
"time": "0.0132 sec.",
"cost": 0,
"result_count": 1,
"path": [
"v3",
"business_data",
"google",
"reviews",
"task_get",
"09221402-1535-0298-0000-be12fe4b9499"
],
"data": {
"se_type": "reviews",
"se": "google",
"api": "business_data",
"function": "reviews",
"cid": "18034889698101052014",
"location_name": "London,England,United Kingdom",
"language_name": "English",
"depth": 10,
"sort_by": "newest",
"tag": "loc_covent_garden",
"device": "desktop",
"os": "windows"
},
"result": [
{
"keyword": "cid:18034889698101052014",
"type": "google_reviews",
"se_domain": "google.co.uk",
"location_code": 1006886,
"language_code": "en",
"check_url": "https://www.google.co.uk/search?q=Honest+Burgers+Covent+Garden+33+Southampton+St%2C+London+WC2E+7HE%2C+United+Kingdom&sort=newestFirst&hl=en&gl=GB&gws_rd=cr&ie=UTF-8&oe=UTF-8",
"datetime": "2026-09-22 14:03:36 +00:00",
"title": "Honest Burgers Covent Garden",
"sub_title": "33 Southampton St, London WC2E 7HE, United Kingdom",
"rating": {
"rating_type": "Max5",
"value": 4.4,
"votes_count": 4228,
"rating_max": 5
},
"feature_id": "0x0:0xfa48cca0a2aa426e",
"place_id": null,
"cid": "18034889698101052014",
"reviews_count": 4228,
"items_count": 10,
"items": [
{
"type": "google_reviews_search",
"rank_group": 1,
"rank_absolute": 1,
"position": "left",
"xpath": null,
"review_text": "Very nice service really yummy",
"original_review_text": null,
"original_language": "en",
"time_ago": "56 minutes ago",
"timestamp": "2026-09-22 13:07:05 +00:00",
"rating": {
"rating_type": "Max5",
"value": 5,
"votes_count": null,
"rating_max": 5
},
"reviews_count": 3,
"photos_count": null,
"local_guide": false,
"profile_name": "Christian Matschewsky",
"profile_url": "https://www.google.com/maps/contrib/107142390640709743251/reviews?hl=en-GB",
"review_url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2pFd05rUnRWV2hOUW10TE0ySkJWbTlKVlc1cGNYYxAB!2m1!1s0x0:0xfa48cca0a2aa426e",
"profile_image_url": "https://lh3.googleusercontent.com/a/ACg8ocJrlPe4fj27dSFmLZy1FUf1XmM6l1kyalVH_kEi1o1fr5OHmg=s64-c-rp-mo-br100",
"owner_answer": null,
"original_owner_answer": null,
"owner_time_ago": null,
"owner_timestamp": null,
"review_id": "Ci9DQUlRQUNvZENodHljRjlvT2pFd05rUnRWV2hOUW10TE0ySkJWbTlKVlc1cGNYYxAB",
"images": null,
"review_highlights": [
{
"feature": "Meal type",
"assessment": "Lunch"
},
{
"feature": "Price per person",
"assessment": "£20–30"
},
{
"feature": "Food",
"assessment": "5"
},
{
"feature": "Service",
"assessment": "5"
},
{
"feature": "Atmosphere",
"assessment": "5"
}
]
},
{
"type": "google_reviews_search",
"rank_group": 7,
"rank_absolute": 7,
"position": "left",
"xpath": null,
"review_text": null,
"original_review_text": null,
"original_language": null,
"time_ago": "3 days ago",
"timestamp": "2026-09-19 01:15:56 +00:00",
"rating": {
"rating_type": "Max5",
"value": 4,
"votes_count": null,
"rating_max": 5
},
"reviews_count": null,
"photos_count": null,
"local_guide": false,
"profile_name": "Lucrezia Balestrieri",
"profile_url": "https://www.google.com/maps/contrib/110782999618982152390/reviews?hl=en-GB",
"review_url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT20xeWVYaFFRME0zYlZkSWNIbHNha1ZzWWxWcU4zYxAB!2m1!1s0x0:0xfa48cca0a2aa426e",
"profile_image_url": "https://lh3.googleusercontent.com/a-/ALV-UjUMmSdXRiWHnnk9DpdK2JBfNa4LEmMJ-lEDG8vxtF6fqZveykYvRQ=s64-c-rp-mo-br100",
"owner_answer": null,
"original_owner_answer": null,
"owner_time_ago": null,
"owner_timestamp": null,
"review_id": "Ci9DQUlRQUNvZENodHljRjlvT20xeWVYaFFRME0zYlZkSWNIbHNha1ZzWWxWcU4zYxAB",
"images": null,
"review_highlights": null
},
{
"type": "google_reviews_search",
"rank_group": 9,
"rank_absolute": 9,
"position": "left",
"xpath": null,
"review_text": "Good value for money compared to other options in the area. The Honest burger with bacon was delicious. The place could be a little cleaner to be truly excellent.",
"original_review_text": "buen precio-calidad en comparación a las opciones de la zona. Muy rica la Honest con bacon. El lugar podría mejorar un poco en limpieza para ser excelente",
"original_language": "es",
"time_ago": "a week ago",
"timestamp": "2026-09-15 00:46:17 +00:00",
"rating": {
"rating_type": "Max5",
"value": 4,
"votes_count": null,
"rating_max": 5
},
"reviews_count": 5,
"photos_count": 7,
"local_guide": false,
"profile_name": "Sofía Sánchez",
"profile_url": "https://www.google.com/maps/contrib/117217949875897254652/reviews?hl=en-GB",
"review_url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT21ZeFJqSnRUWG90VERGUGFFb3dRelZEWld0TWFIYxAB!2m1!1s0x0:0xfa48cca0a2aa426e",
"profile_image_url": "https://lh3.googleusercontent.com/a-/ALV-UjWxCLTJXZrAf8AWC7tFDkg3fiaJ5WUqIBZtvEEBXI_Znasw0aJWaQ=s64-c-rp-mo-br100",
"owner_answer": null,
"original_owner_answer": null,
"owner_time_ago": null,
"owner_timestamp": null,
"review_id": "Ci9DQUlRQUNvZENodHljRjlvT21ZeFJqSnRUWG90VERGUGFFb3dRelZEWld0TWFIYxAB",
"images": [
{
"type": "images_element",
"alt": null,
"url": null,
"image_url": "https://lh3.googleusercontent.com/grass-cs/ACvplmMeMELjp7sfTx83KDroVmw-AUGNRSc6ITaJuYpqQ2he_paAOgSLM8TV4wQOJYCe-3ul_rc5mSA9_h5yPslup7ZPPGXFWrXobyJIf88y4iqomTIi9t8DNa3qhRP_gKvMbAv-Bsx8W13Xt7-i=k-no"
}
],
"review_highlights": [
{
"feature": "Meal type",
"assessment": "Dinner"
},
{
"feature": "Price per person",
"assessment": "£10–20"
},
{
"feature": "Food",
"assessment": "5"
},
{
"feature": "Service",
"assessment": "5"
},
{
"feature": "Atmosphere",
"assessment": "4"
}
]
}
]
}
]
}
]
}
Step 4. Dedupe, store, alert. Every item carries the review_id field that stays stable across pulls, so dedupe on that and insert only what is new. Two alerts cover most of the value: any new review rated 3 or below, and any review where the owner_answer field is still null after your response window. In the pull above, all ten items came back with owner_answer displaying null. That is a week of replies nobody wrote, found in one request.
Reading the data: the fields that carry the signal
A review item has around twenty fields. Five of them do most of the work.
review_id: stable across pulls, and the only safe dedupe key. Two people can leave the same three-word review in the same minute, so text and timestamps will not separate them.timestamp: the absolute time of the review. Store this rather thantime_ago, which arrives as “56 minutes ago” or “a week ago” and stops meaning anything the moment you write it to a database.rating.value: the per-review score, and the trigger for most alerts. Four of the ten reviews above hadreview_textset to null, because plenty of people rate without writing. An alert keyed to text would have missed all four.owner_answerandowner_timestamp: the two of them give you a response rate and a median time to reply for each location. Both are numbers a client can do something about the same week.original_review_textandoriginal_language: populated when the review was not written in the language you asked for. Three of the ten items came from Arabic, Italian, and Spanish originals, with the translation inreview_text. For a brand in a tourist district that can be a large share of the feedback.
review_highlights, images, and the reviewer profile fields are worth having later, once there is a dashboard to put them in. A first version runs fine without them.
Conclusion
Most of the difficulty in review monitoring is collection, not analysis. Once every location has a stable identifier and the pull runs on a schedule, you are left with two ordinary database questions: what is new, and what is still unanswered. The workflow above is small on purpose, one brand and three endpoints, and adding the fiftieth location means adding a row rather than rebuilding anything. Our Business Data API docs carry the full parameter reference, and you can try for free to start pulling review data for your own locations.