A Yelp business page holds more structured detail than almost any other local source: hours, amenities, price tier, popular dishes, review highlights, sometimes a full menu. Getting that detail out programmatically is the annoying part, since the official developer offering trims most of it away. Here is the manual route, its limits, and the shortcut: the Yelp Business API on Apify, which takes a place ID and returns the full profile as JSON.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Yelp have an API?
It does: Yelp Fusion, and for a search box in an app it is a fine choice. For data work it gets cramped fast. You need an API key, daily call limits apply, and the responses are slimmed down compared with what the public business page shows. Full menus, amenity lists, popular dishes, and review highlights are the kind of page-level detail the official response does not carry. A scraper-as-API closes that gap: the same public page, returned whole, as one JSON item per business.
What the Yelp Business API returns
The Yelp Business API returns a complete business profile per place ID: name, rating, review count, price, contact details, hours, amenities, and popular dishes as structured JSON.
| Field | Example | Notes |
|---|---|---|
place_results.name |
Maman |
With categories and neighborhoods
|
rating |
3.9 |
Plus reviews count, here 847
|
price |
$$ |
Yelp's price tier |
operation_hours |
{ "day": "Mon", "hours": "7:30 AM - 6:00 PM" } |
Per weekday |
features |
{ "title": "Offers Delivery", "is_active": true } |
Amenities as structured flags |
popular_items |
{ "title": "Almond Croissant", "reviews": 28 } |
Dishes with mention counts |
Set full_menu to true and menu sections arrive in full_menu_results when the business publishes one on Yelp.
Who this is for
Teams building competitor profiles who want ratings and amenities across every rival in a neighborhood. Data folks enriching a lead list, turning bare business names into records with phone, website, and hours. And restaurant-tech builders who need menus and popular dishes as data rather than screenshots.
The manual way, and where it breaks
By hand, you open each business page and copy fields into a sheet, which holds up for about ten businesses and then collapses. Scripting it directly is harder than it looks: the page is JavaScript-heavy, anti-bot measures are real, and the interesting details sit in different page fragments that load separately. Keeping selectors alive across Yelp's layout updates becomes a part-time job. I would rather not have that job, which is roughly the origin story of this Actor.
The faster way: run the Yelp business scraper
Apify Console
- Open the Yelp Business API and click Try for free.
- Paste one or more
place_ids, the slug from any Yelp business URL, likemaman-new-york-22. - Run it and export the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~Yelp-Place-API/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "place_ids": ["maman-new-york-22"], "full_menu": false }'
The run lifecycle is in the Apify API docs.
Profile businesses in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/Yelp-Place-API").call(
run_input={"place_ids": ["maman-new-york-22"]}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
place = item.get("place_results", {})
print(place.get("name"), place.get("rating"), place.get("reviews"), place.get("price"))
One item per place ID, so batching fifty competitors is just a longer list.
Get one business profile by ID
The minimal case, one ID in and one full profile out, lives in the task Get a Yelp business profile by ID.
Enrich a list of businesses in bulk
Feed a whole column of place IDs and get back a dataset with phone, website, hours, and ratings per row: Enrich Yelp business listings in bulk.
Extract a restaurant's full menu
With full_menu enabled, menu sections and items come back as data. The task Extract a restaurant's full menu from Yelp shows the exact input.
Check a health inspection score
Where Yelp displays a health inspection result for a business, the profile carries it, and the task Get a Yelp health inspection score by place ID pulls that signal on demand.
Track competitor ratings and amenities
Run the same ID list on a schedule and diff the output over time, which is the whole competitor-profiles recipe: Track Yelp competitor ratings and amenities.
Wire it into Claude over MCP
Through the Apify MCP server, the Actor becomes a tool that Claude, Claude Code, and Cursor can call directly, so "pull the profile for maman-new-york-22 and summarize the amenities" runs a live fetch instead of relying on memory. More on Claude at claude.ai.
FAQ about scraping Yelp business data
What does the Yelp business scraper cost per profile?
Pricing is per event: $0.02 to start a run and $0.02 per place processed. One business is about $0.04, ten in a batch about $0.22, and new Apify accounts include free platform credit to start.
Where does the scraper get its place IDs?
From any Yelp business URL: the slug after /biz/ is the ID. For discovery at scale, a companion search Actor returns IDs by term and location, which you then feed into this one.
Can the scraper return business hours and amenities?
Yes, both. Hours arrive per weekday in operation_hours, and amenities come back as structured features flags like "Offers Delivery" with an active state, which makes filtering trivial.
Can Claude call this Yelp scraper through MCP?
It can. Connect the Apify MCP server and the Actor appears as a callable tool in Claude, Claude Code, Cursor, and other MCP clients, with results returned into the conversation.
How do I schedule the scraper to watch competitors?
Save your ID list as a task, attach an Apify schedule, and each run appends timestamped profiles you can diff for rating and amenity changes. Start from the Yelp Business API.
What will the scraper miss?
Anything the public page does not show. Menus only come back when a business publishes one on Yelp, some profiles lack phones or websites, and a requested menu that does not exist returns a profile with menu_returned set to false rather than invented data.
More from Truffle Pig Data
This Actor is the middle of a three-stage suite: the Yelp Search API finds place IDs by term and location, this one profiles them, and the Yelp Reviews API pulls the full review text. For a second opinion on the same businesses, cross-reference with the Google Maps Places API.
Wrapping up
Yelp's business pages are dense with data that the official API never hands over. Feed a place ID to the Yelp Business API and get the whole profile back as JSON.
Top comments (0)