The pairing is the whole workflow: search returns place ids, and passing a place id rather than a business name into the review call is what stops it matching the wrong branch. Set the region and language explicitly on both — the defaults will happily return an English-language read of a market you were not asking about. Enrichment is where a search turns into a contact list, and it is a parameter on the same call rather than a separate step.
Two calls against Outscraper's Google Maps extraction service: one finds places, one returns their reviews. Large requests are handled asynchronously by the service, so a big pull is one call rather than a paging loop of your own.
- Place search from a plain query such as restaurants brooklyn usa, up to 400 results a call, with duplicates optionally dropped
- Results localised by language code and narrowed to a country or region code, so a query for one market does not return another
- Enrichment on the search call — domains_service and emails_validator_service add contact information to the rows
- Reviews for a place named by query, business name or place id, with the number of reviews per place set per call and 0 meaning no limit
- Reviews sorted by most_relevant, newest, highest_rating or lowest_rating, and cut off at a Unix timestamp when only recent ones matter
An Outscraper API key in OUTSCRAPER_API_KEY, from the account profile page — usage is billed by Outscraper, not by this package. Python 3.10 or newer; it starts over stdio as uvx outscraper-mcp, and can be run over Streamable HTTP instead by launching it with that transport. The search call is what returns the place ids that make the reviews call precise.
One command plus a key — uvx outscraper-mcp, then supply credentials
