Prisma Reviews / Guides / Aggregate reviews in your app
How to aggregate customer reviews from different sites into your app
Short answer: connect each review platform once, store every review in one table keyed by platform and review id, and update it from webhooks instead of polling. You can do that with each platform’s own API, with a scraper, or with one reviews API that does the connecting for you. For businesses and apps you own or manage, a unified reviews API such as Prisma Reviews returns reviews from 84 platforms in one JSON format with one API key, and replies by official API where the platform allows it.
The three ways to aggregate reviews
| Approach | What you build | Works for | The catch |
|---|---|---|---|
| Each platform’s own API | One integration per platform: auth, pagination, rate limits, data mapping | Your own businesses and apps | Every platform is different, and some barely give you anything (Google Play’s API returns only the last 7 days, Yelp’s 3 excerpts per business) |
| Scraping or a public-data provider | Calls to a scraping service, per review or per search | Any business, yours or not | Read only, no replies, and it breaks or gets blocked when pages change |
| A unified reviews API | One integration | Businesses and apps you own or manage | You depend on one vendor; check which platforms it covers and how it connects to each |
The platform limits are real and documented: Google Play keeps 7 days in its API, Yelp returns 3 review excerpts, and Google’s Places API returns at most 5 reviews per place, while the full feed needs the Google Business Profile API and its approval. Which platforms have an API at all is in this table.
Step by step with one reviews API
1. Connect each platform once
The business connects each account: an official sign-in or API token where the platform has an official API, or the address of its own public page where it doesn’t. You can create connections from your app with the API, or send your customer a connect link.
curl -X POST https://api.prismareviews.com/v1/connections \
-H "Authorization: Bearer $PRISMA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform": "yelp", "listing_url": "https://www.yelp.com/biz/acme-coffee-san-francisco"}'2. Read every review in one format
Every review comes back with the same fields, whatever the platform: id, platform, location_id, rating (1 to 5), text, author, created_at, reply and url. Page through with cursor until next_cursor is null.
curl "https://api.prismareviews.com/v1/reviews?limit=50" \
-H "Authorization: Bearer $PRISMA_API_KEY"let cursor = null;
do {
const url = new URL('https://api.prismareviews.com/v1/reviews');
url.searchParams.set('limit', '50');
if (cursor) url.searchParams.set('cursor', cursor);
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.PRISMA_API_KEY}` } });
const { data, next_cursor } = await res.json();
for (const review of data) await saveReview(review); // upsert by review.id
cursor = next_cursor;
} while (cursor);import os, requests
cursor = None
while True:
params = {"limit": 50, **({"cursor": cursor} if cursor else {})}
r = requests.get("https://api.prismareviews.com/v1/reviews", params=params,
headers={"Authorization": f"Bearer {os.environ['PRISMA_API_KEY']}"})
body = r.json()
for review in body["data"]:
save_review(review) # upsert by review["id"]
cursor = body["next_cursor"]
if not cursor:
break3. Keep it fresh with webhooks
Register a webhook and Prisma sends review.created and review.updated for every platform, including the ones that have no webhooks of their own (Prisma checks those on a schedule that depends on the plan). Events carry ids only: fetch the review with GET /v1/reviews/{id} and upsert it, so a late or repeated event never overwrites newer data. The webhooks reference covers signatures and retries.
4. Show them, or answer them
Show the reviews in your own UI, compute your own averages, or let your users reply: POST /v1/reviews/{id}/reply publishes their text through the platform’s official API where it allows replies, and returns 422 reply_not_supported with the review’s url where it doesn’t. See which review APIs let you reply.
Data model tips
- Key by platform and review id, never by text or author: reviewers edit, rename and delete.
- Keep the platform’s
urlon every row. It is the link to answer on read-only platforms and the proof of where the review lives. - Don’t average across platforms blindly. A Facebook recommendation (Prisma maps it to 5 or 1 stars) is not the same signal as a 4-star Google review; show per-platform ratings next to any combined number.
- Deleted reviews matter. Platforms remove reviews; keep a
deleted_atinstead of dropping the row. Prisma’s deleted review alert emails you when one disappears on official-API platforms.
Try it without connecting anything
A test key (pk_test_…) returns sample reviews from every platform in the real format, so you can build the table, the webhook handler and the UI before a customer connects a single account. Start with the quickstart, or get a free key: 2 locations are free.