# Yelp Scraper AIO - Reviews, Photos & Business Details (`mof1re/yelp-scraper-pro-all-in-one`) Actor

Fast all-in-one Yelp scraper. Extract business listings, reviews (with owner replies) and media (photos/videos in original size) by URL, business ID, search query or category. No limits on reviews/media, synced by business ID for easy processing. Full Yelp category tree included.

- **URL**: https://apify.com/mof1re/yelp-scraper-pro-all-in-one.md
- **Developed by:** [Vladimir Efimenco](https://apify.com/mof1re) (community)
- **Categories:** Developer tools, Automation, Lead generation
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 scraped business details

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🔥 Yelp Scraper - All in One: Business, Reviews & Photos/Videos, No Limits

Extract Yelp business data, reviews, and media in one run. Pure HTTP based Yelp scraper built on a full reverse engineering of the Yelp mobile app, so it's fast and doesn't rely on a browser. Get business listings, detailed reviews with owner replies, and photos/videos in original size, all synced by business ID.

### 🍽️ What this Yelp scraper does

This is an all in one Yelp scraper: business listings, reviews, and media in a single actor run, no need to chain three different tools together. Feed it Yelp URLs, business IDs, or aliases, or just give it a location plus a search query or category, and it pulls everything you asked for.

Most Yelp scrapers on the market cap you at Yelp's own review or photo limits. This one doesn't. Reviews and media have no limit set by the actor, only what actually exists on the business page. The only cap is Yelp's own 240 result limit on search/category runs, and even that can be worked around with sort and filter combinations.

#### Why people use this Yelp business, reviews & photos scraper

- 🧩 **All in one**: business details, reviews, and media in one run, three clean output datasets synced by business ID.
- ♾️ **No review or media limits**: pull every review and every photo/video Yelp has, not just the first page.
- 🏷️ **Full Yelp category tree included**: browse the actor's category list to get the exact category slug instead of guessing.
- 🔗 **Flexible input**: direct URLs, business IDs, aliases, or location + search query, or location + category.
- ⚡ **Fast pure HTTP scraping**: reverse engineered from the Yelp mobile app, including its crypto signing, so no headless browser needed.
- 🎯 **Review filtering built in**: filter by star rating, sort by date or rating, cut off at a review date, and check reviews locally against your own keyword list.
- 💬 **Owner replies included**: every review comes with the business owner's reply if one exists.
- 📸 **Original size media**: photos come back in full original resolution, not thumbnails, with captions, dates, and author info. Videos include duration and thumbnail.

***

### ⚙️ How this Yelp scraper works

1. **Pick your input mode** - either paste Yelp business URLs/IDs/aliases directly, or give a location with a search query or a category.
2. **Search mode fetches listings first** - with a search query or category, the actor searches Yelp for matching businesses in that location and collects the business data straight from the search results.
3. **Listing URL mode goes straight to the business** - give it URLs, IDs, or aliases and it fetches each business directly, no search step needed.
4. **Reviews and media are fetched per business, in the same run** - turn on `scrapeReviews` and/or `scrapeMedia` and every business found (from either mode) gets its reviews and/or media pulled right after.
5. **Everything lands synced by business ID** - business, review, and media rows all carry the same business ID, so joining them in a spreadsheet or a script is a simple lookup, no fuzzy matching needed.

***

### 📥 Input

Run this Yelp scraper from the Apify Console with the input form, or pass the same fields as JSON through the API.

#### 🧭 Main mode

| Field | Type | Default | What it does |
|---|---|---|---|
| `mainMode` | string | `search` | `listing_urls` scrapes the URLs/IDs you give it directly. `search` runs a search query or category search first. |

#### 🔗 Listing URLs (used when `mainMode` is `listing_urls`)

| Field | Type | Default | What it does |
|---|---|---|---|
| `listingUrls` | array of strings | - | Yelp business URLs, aliases, or IDs to scrape directly. All three formats can be mixed in the same list. |

#### 🔍 Search / Category (used when `mainMode` is `search`)

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchMode` | string | `query` | `query` searches by free-text keyword. `category` searches by a fixed Yelp category slug. |
| `searchQuery` | string | - | Keyword to search for, e.g. "coffee shop", "plumber". Used only in query mode. |
| `category` | string | - | Yelp category slug, e.g. "coffee", "autorepair". Used only in category mode. Full category list with copyable slugs is linked in the actor's input form. |
| `location` | string | - | City, state, ZIP, or "City, State", e.g. "Newark, DE", "90210", "Beverly Hills, CA". |
| `sort` | string | `default` | Result order: recommended, distance, rating high to low, or review count high to low. |
| `openNow` | boolean | `false` | Only include businesses currently open. |
| `priceRange` | array | `[]` | Filter by price level, $ to $$$$. Not every category supports this, Yelp just ignores it when it doesn't apply. |
| `maxResults` | integer | `50` | Max results per search/category. `0` = all available, capped at 240 by Yelp itself. |

#### ⚙️ Common settings (apply to every business found, in either mode)

| Field | Type | Default | What it does |
|---|---|---|---|
| `scrapeReviews` | boolean | `true` | Fetch reviews for each business. |
| `scrapeBusinessDetails` | boolean | `false` | Fetch full business details. Only needed in Listing URLs mode, search mode already returns full business data. |
| `scrapeMedia` | boolean | `false` | Fetch photos and videos for each business. |

#### ⭐ Review settings

| Field | Type | Default | What it does |
|---|---|---|---|
| `maxReviews` | integer | `100` | Max reviews per business. `0` = all available. |
| `reviewRating` | string | `any` | Only fetch reviews with this star rating. |
| `reviewSortBy` | string | `relevance_desc` | Newest first, oldest first, highest rating, lowest rating, or relevance. |
| `reviewCutoffDate` | string | - | Only works with newest/oldest sort. Stops fetching further reviews for a business once this date is reached. |
| `reviewKeywords` | array of strings | `[]` | Keywords checked locally against each review's text (not sent to Yelp). Every review gets a per-keyword match flag plus an overall match flag. |

#### 📷 Media settings

| Field | Type | Default | What it does |
|---|---|---|---|
| `maxMedia` | integer | `1000` | Max photos/videos per business. `0` = all available. |

***

### 📤 Output

Three datasets come out of a single run, all keyed by business ID so joining them later is straightforward.

#### 🏢 Business listings

| Field | Description |
|---|---|
| `search_type` | Which search mode produced this row: search\_term or category |
| `query` | The search term or category slug used |
| `total_results` | Total results reported by Yelp for this search |
| `id` | Yelp business ID |
| `name` | Business name |
| `url` | Public Yelp business page URL |
| `website` | Business's own website, if listed |
| `country` | Country code |
| `address1` / `address2` / `address3` | Address lines |
| `state` | State/region code |
| `city` | City |
| `zip` | ZIP/postal code |
| `locality` | Locality/neighborhood-level area name |
| `cross_streets` | Nearest cross streets, if available |
| `address_shortform` | Short-form localized address |
| `address_longform` | Long-form localized address |
| `latitude` / `longitude` | Coordinates |
| `neighborhoods` | List of neighborhood names |
| `distance` | Distance from the search location, in the unit Yelp returned |
| `timezone` | Business timezone |
| `work_hours_detailed` | Parsed opening hours by day |
| `localized_hours` | Localized hours text/structure as returned by Yelp |
| `business_special_hours` | Special/holiday hours, if any |
| `localized_business_special_hours` | Localized special hours text |
| `is_closed` | Whether the business is permanently closed |
| `is_temp_closed` | Whether the business is temporarily closed |
| `is_yelp_guaranteed` | Whether the business has Yelp Guaranteed status |
| `is_chain_business` | Whether Yelp flags this as a chain business |
| `is_online_business` | Whether this is an online-only business |
| `is_searchable_nearby` | Whether Yelp allows nearby-search matching for this business |
| `is_multiple_reservations_allowed` | Whether multiple reservations are allowed |
| `review_count` | Total review count |
| `avg_rating` | Rounded average star rating |
| `unrounded_avg_rating` | Unrounded average star rating |
| `price` | Price level, e.g. $, $$, $$$ |
| `localized_price` | Localized price level text |
| `categories` | List of category names |
| `phone` | Phone number |
| `localized_phone` | Localized/formatted phone number |
| `services_list` | List of business services offered |
| `localized_attributes` | Localized business attributes as returned by Yelp |
| `message_the_business` | Message-the-business info: responsiveness, response\_time, reply\_rate |
| `from_this_business` | Owner-provided info: representative name/bio/role, specialties, history, year\_established |
| `primary_photo` | Full-size URL of the primary photo |
| `primary_photo_thumb` | Thumbnail URL of the primary photo |
| `total_photos` | Total photo count reported by Yelp |
| `video_count` | Total video count reported by Yelp |
| `base_photos` | List of business initial photos (url, caption, width, height, type) |
| `service_area_locations` | User-specified service area locations, for businesses that serve a region rather than a fixed address |
| `regular_count` | Regulars count as reported by Yelp |

**Example output:**

```json
[
  {
    "search_type": "category",
    "query": "autorepair",
    "query_location": "90211",
    "total_results": null,
    "id": "1260m1JUUCE4RBrbKgZ8qg",
    "name": "Lucy's Auto Center",
    "url": "https://www.yelp.com/biz/lucys-auto-center-los-angeles?utm_source=ashare",
    "website": "http://lucysautocenter.com",
    "country": "US",
    "address1": "5601 W Pico Blvd",
    "address2": "",
    "address3": "",
    "state": "CA",
    "city": "Los Angeles",
    "zip": "90019",
    "locality": "Los Angeles, CA 90019",
    "cross_streets": null,
    "address_shortform": "5601 W Pico Blvd, Mid-Wilshire",
    "address_longform": "5601 W Pico Blvd, Los Angeles, CA 90019",
    "latitude": 34.0501405600806,
    "longitude": -118.360181049109,
    "neighborhoods": [
      "Mid-Wilshire"
    ],
    "distance": null,
    "timezone": "America/Los_Angeles",
    "work_hours_detailed": [
      {
        "day": "Mon",
        "open": "07:30",
        "close": "17:00"
      },
      {
        "day": "Tue",
        "open": "07:30",
        "close": "17:00"
      },
      {
        "day": "Wed",
        "open": "07:30",
        "close": "17:00"
      },
      {
        "day": "Thu",
        "open": "07:30",
        "close": "17:00"
      },
      {
        "day": "Fri",
        "open": "07:30",
        "close": "17:00"
      },
      {
        "day": "Sat",
        "open": "08:00",
        "close": "12:00"
      }
    ],
    "localized_hours": [
      "Mon-Fri 7:30 am - 5:00 pm",
      "Sat 8:00 am - 12:00 pm"
    ],
    "business_special_hours": null,
    "localized_business_special_hours": null,
    "is_closed": false,
    "is_temp_closed": false,
    "is_yelp_guaranteed": false,
    "is_chain_business": false,
    "is_online_business": null,
    "is_searchable_nearby": false,
    "is_multiple_reservations_allowed": true,
    "review_count": 481,
    "avg_rating": 4.5,
    "unrounded_avg_rating": 4.3,
    "price": null,
    "localized_price": null,
    "categories": [
      "Auto Repair",
      "Body Shops"
    ],
    "phone": "3239302525",
    "localized_phone": "(323) 930-2525",
    "services_list": [
      {
        "id": "services_car_ford",
        "name": "Services Ford"
      },
      {
        "id": "after_hour_car_drop_offs",
        "name": "After Hours Drop-Off"
      },
      {
        "id": "dent_repair",
        "name": "Dent Repair"
      },
      {
        "id": "services_car_infiniti",
        "name": "Services Infiniti"
      },
      {
        "id": "towing",
        "name": "Towing"
      },
      {
        "id": "services_car_mazda",
        "name": "Services Mazda"
      },
      {
        "id": "services_car_acura",
        "name": "Services Acura"
      },
      {
        "id": "services_car_toyota",
        "name": "Services Toyota"
      },
      {
        "id": "engine_repair",
        "name": "Engine Repair"
      },
      {
        "id": "muffler_and_exhaust",
        "name": "Muffler & Exhaust Services"
      },
      {
        "id": "services_car_scion",
        "name": "Services Scion"
      },
      {
        "id": "vehicle_inspections",
        "name": "Vehicle Inspections"
      },
      {
        "id": "electric_car_repair",
        "name": "Electric Car Repair"
      },
      {
        "id": "alignment_suspension",
        "name": "Suspension Services"
      },
      {
        "id": "services_car_chrysler",
        "name": "Services Chrysler"
      },
      {
        "id": "services_car_kia",
        "name": "Services Kia"
      },
      {
        "id": "car_battery_replacement_and_repair",
        "name": "Battery Services"
      },
      {
        "id": "services_car_lexus",
        "name": "Services Lexus"
      },
      {
        "id": "services_car_gmc",
        "name": "Services GMC"
      },
      {
        "id": "auto_paint_restoration",
        "name": "Paint Restoration"
      },
      {
        "id": "hybrid_car_repair",
        "name": "Hybrid Car Repair"
      },
      {
        "id": "services_car_nissan",
        "name": "Services Nissan"
      },
      {
        "id": "services_car_volvo",
        "name": "Services Volvo"
      },
      {
        "id": "services_car_mini",
        "name": "Services Mini"
      },
      {
        "id": "services_car_porsche",
        "name": "Services Porsche"
      },
      {
        "id": "services_car_chevrolet",
        "name": "Services Chevrolet"
      },
      {
        "id": "frame_straightening",
        "name": "Frame Straightening"
      },
      {
        "id": "services_car_buick",
        "name": "Services Buick"
      },
      {
        "id": "services_car_dodge",
        "name": "Services Dodge"
      },
      {
        "id": "services_car_bmw",
        "name": "Services BMW"
      },
      {
        "id": "services_car_audi",
        "name": "Services Audi"
      },
      {
        "id": "auto_glass_repair",
        "name": "Glass Repair"
      },
      {
        "id": "tire_wheel",
        "name": "Tire Rotation & Wheel Alignment"
      },
      {
        "id": "services_car_jaguar",
        "name": "Services Jaguar"
      },
      {
        "id": "services_car_subaru",
        "name": "Services Subaru"
      },
      {
        "id": "services_car_cadillac",
        "name": "Services Cadillac"
      },
      {
        "id": "vehicle_air_conditioning",
        "name": "Air Conditioning Services"
      },
      {
        "id": "free_estimates",
        "name": "Free Estimates"
      },
      {
        "id": "services_car_lincoln",
        "name": "Services Lincoln"
      },
      {
        "id": "services_car_mercedes_benz",
        "name": "Services Mercedes-Benz"
      },
      {
        "id": "vehicle_light",
        "name": "Headlight & Taillight Services"
      },
      {
        "id": "services_car_honda",
        "name": "Services Honda"
      },
      {
        "id": "services_car_volkswagen",
        "name": "Services Volkswagen"
      },
      {
        "id": "offers_frame_testing",
        "name": "Frame testing"
      },
      {
        "id": "services_car_mitsubishi",
        "name": "Services Mitsubishi"
      },
      {
        "id": "services_car_land_rover",
        "name": "Services Land Rover"
      },
      {
        "id": "services_car_fiat",
        "name": "Services Fiat"
      },
      {
        "id": "auto_paint_services",
        "name": "Paint Services"
      },
      {
        "id": "oil_change",
        "name": "Oil Change"
      },
      {
        "id": "auto_brake_services",
        "name": "Brake Services"
      },
      {
        "id": "vehicle_electrical",
        "name": "Vehicle Electrical Repair"
      },
      {
        "id": "services_car_jeep",
        "name": "Services Jeep"
      },
      {
        "id": "transmission",
        "name": "Transmission Repair"
      },
      {
        "id": "services_car_hyundai",
        "name": "Services Hyundai"
      },
      {
        "id": "auto_collision_repair",
        "name": "Collision Repair"
      }
    ],
    "localized_attributes": [
      {
        "id": "BusinessAcceptsCreditCards",
        "label": "Accepts Credit Cards",
        "value": "Yes"
      },
      {
        "id": "WiFi",
        "label": "Wi-Fi",
        "value": "Free"
      },
      {
        "id": "OffersMilitaryDiscount",
        "label": "Offers Military Discount",
        "value": "Yes"
      },
      {
        "id": "GenderNeutralRestrooms",
        "label": "Gender-neutral restrooms",
        "value": "Yes"
      },
      {
        "id": "BusinessOpenToAll",
        "label": "Open to All",
        "value": "Yes"
      }
    ],
    "message_the_business": {
      "responsiveness": "Replies in about <strong>20 mins</strong>",
      "response_time": "20 mins",
      "reply_rate": "100%"
    },
    "from_this_business": {
      "representative_name": "Mr. T.",
      "representative_bio": "Lucy's Auto Center is your one stop shop for complete automotive care and service. We handle all aspects of automotive needs from Tires to Suspension, Mechanical Work and Auto Body. \n\nWe carry an extensive inventory of quality tires consisting of almost all major brand names. Equipped with a state of the art computer Wheel Balancing and a Computer Alignment system that can handle custom wheels and give you before and after comparisons.",
      "representative_role": "business_owner",
      "specialties": "We are an auto body shop that also provides service and repairs since 1987 in the Los Angeles area. We take every detail into account, from paint and dent work to major car restoration. Whether you've been in an accident or just need a touch up, we've got you covered. We offer parts and accessories as well. Come by today to get an estimate and information!",
      "history": "Lucy's Auto Center has been the leader at providing excellent  service and qualiy craftsmanship by servicing the vehicles in the community for years.  Trained technicians provide the highest level of service that  customers deserve. \"We value our customers and believe that good quality workmanship and excellent customer service go hand in hand in providing a satisfactory experience\". That is why the staff at Lucy's strive to go the extra mile to make sure eveyone leaves  with a smile on their face. \n           \nA family operated shop now run by Lucy, who her father named the shop after. Lucy's  has grown throughout the years to be one of the leaders in the tire servicing industry with state of the art equipment, competitive prices, and factory trained technicians. Lucy's Auto Center truly is your One Stop Shop for all your automobile needs.",
      "year_established": 2007
    },
    "primary_photo": "https://s3-media0.fl.yelpcdn.com/bphoto/948MRgoCgOLwONq09TFm7g/o.jpg",
    "primary_photo_thumb": "https://s3-media0.fl.yelpcdn.com/bphoto/948MRgoCgOLwONq09TFm7g/ms.jpg",
    "total_photos": 41,
    "video_count": null,
    "base_photos": [
      {
        "https://s3-media0.fl.yelpcdn.com/bphoto/948MRgoCgOLwONq09TFm7g/o.jpg": {
          "caption": "Best place ever. Hit and run in the parking lot at work. They got it done in less than 2 days. Flawless.",
          "width": 1440,
          "height": 1440,
          "type": "business"
        }
      },
      {
        "https://s3-media0.fl.yelpcdn.com/bphoto/78h3xEE1JYa8FoG0hfnR7Q/o.jpg": {
          "caption": "before & after ! A++",
          "width": 1212,
          "height": 795,
          "type": "business"
        }
      },
      {
        "https://s3-media0.fl.yelpcdn.com/bphoto/ltGRHaCsCxr7hQzK4-SHVQ/o.jpg": {
          "caption": null,
          "width": 1494,
          "height": 996,
          "type": "business"
        }
      },
      {
        "https://s3-media0.fl.yelpcdn.com/bphoto/6Y8yfdBsqqrdpFQPVSGDwg/o.jpg": {
          "caption": null,
          "width": 1920,
          "height": 2560,
          "type": "business"
        }
      }
    ],
    "service_area_locations": null,
    "regular_count": 0
  }
]
```

#### ⭐ Reviews

| Field | Description |
|---|---|
| `business_id` | Links back to the business row |
| `review_id` | Yelp review ID |
| `rating` | Star rating of the review |
| `text` | Review text |
| `language` | Review language code |
| `is_featured` | Whether Yelp marked this review as featured |
| `is_online_business` | Whether this is an online-only business |
| `time_modified_unix` / `time_modified_formatted` | Review date, raw and formatted |
| `share_url` | Direct link to the review |
| `feedback_useful` / `feedback_funny` / `feedback_cool` | Reader feedback counts on the review |
| `keyword_match` / `matched_keywords` | Local keyword check results, if `reviewKeywords` was set |
| `previous_reviews` | Edit history: earlier versions of the same review by this user |
| `business_owner_reply` | Owner's reply, if any |
| `media` | Photos/videos attached to the review, each with type, url, caption, dimensions or duration, and like count |
| `user_id` | Yelp user ID |
| `user_profile_url` | Direct link to the reviewer's profile |
| `user_name` | Reviewer display name |
| `user_location` | Reviewer's listed location |
| `user_review_count` | Total reviews written by this user |
| `user_friend_count` | Reviewer's friend count |
| `user_photo_count` / `user_video_count` | Media uploaded by this user |
| `user_check_in_count` | Reviewer's check-in count |
| `user_elite_years` | Years the reviewer held Yelp Elite status |
| `user_location_rank_title` | Reviewer's local rank title, if any |
| `has_user_paid_through_yelp` | Whether the reviewer paid the business through Yelp |
| `user_member_since_unix` / `user_member_since_formatted` | When the reviewer joined Yelp |
| `user_photo_url` | Reviewer's avatar URL |
| `user_feedback` | Raw feedback object as returned by Yelp |

**Example output:**

```json
[
  {
    "business_id": "1260m1JUUCE4RBrbKgZ8qg",
    "review_id": "WyjkjmDEXmGHIDgeJB3deQ",
    "rating": 5,
    "text": "Dropped off my car today for a bumper replacement, dent, and some scratches.  Avo was warm and the most reasonable and transparent repair person I have met in my life! he insisted on not fixing several scratches i can fix myself, and  openly talked out my options and things to consider for my other repairs. gave me some great tips on how car shops work and gave me a fair and reasonable estimate. cant wait to get the car back!\n\n[update] they finished exactly when they said and the price was exactly what they estimated, even though they did a bit of extra work. can't recommend this place more. best car shop experience in my life!",
    "language": "en",
    "is_featured": false,
    "is_online_business": false,
    "time_modified_unix": 1784331338,
    "time_modified_formatted": "07/17/2026 11:35 PM",
    "share_url": "https://www.yelp.com/biz/lucys-auto-center-los-angeles?hrid=WyjkjmDEXmGHIDgeJB3deQ&utm_source=ashare",
    "feedback_useful": 0,
    "feedback_funny": 0,
    "feedback_cool": 0,
    "keyword_match": false,
    "matched_keywords": [],
    "previous_reviews": [],
    "business_owner_reply": null,
    "media": [],
    "user_id": "JCLvWDKrRQB8BhzF5RrD0A",
    "user_profile_url": "https://www.yelp.com/user_details?userid=JCLvWDKrRQB8BhzF5RrD0A",
    "user_name": "EM P.",
    "user_location": "Los Angeles, CA",
    "user_review_count": 3,
    "user_friend_count": 297,
    "user_photo_count": 0,
    "user_video_count": 0,
    "user_check_in_count": 0,
    "user_elite_years": null,
    "user_location_rank_title": "user",
    "has_user_paid_through_yelp": false,
    "user_member_since_unix": 1472884644,
    "user_member_since_formatted": "09/03/2016 06:37 AM",
    "user_photo_url": "https://s3-media0.fl.yelpcdn.com/photo/5bDBT5PQPARLP2lNENRRWA/ms.jpg",
    "user_feedback": {
      "cool": false,
      "funny": false,
      "useful": false
    }
  },
  {
    "business_id": "1260m1JUUCE4RBrbKgZ8qg",
    "review_id": "oP_3Wj4L-bqaidXCZyjXaQ",
    "rating": 5,
    "text": "Found Lucy's on a whim while going through an emergency with my car and I could not be more grateful for finding this shop!! This shop is woman and family owned/run and truly made the entire mechanic shop process so easy. Avo, the owner, is such a helpful and truly funny guy. And everyone on his team is amazing as well! I've always felt so lost when visiting a mechanic shop and this really was the best experience I could've asked for. Shoutout Avo, Lucy & the whole Lucy's Auto team!!",
    "language": "en",
    "is_featured": false,
    "is_online_business": false,
    "time_modified_unix": 1783895678,
    "time_modified_formatted": "07/12/2026 10:34 PM",
    "share_url": "https://www.yelp.com/biz/lucys-auto-center-los-angeles?hrid=oP_3Wj4L-bqaidXCZyjXaQ&utm_source=ashare",
    "feedback_useful": 0,
    "feedback_funny": 0,
    "feedback_cool": 0,
    "keyword_match": false,
    "matched_keywords": [],
    "previous_reviews": [],
    "business_owner_reply": null,
    "media": [],
    "user_id": "jcvCzMCkRAh_4tlfIUHWnQ",
    "user_profile_url": "https://www.yelp.com/user_details?userid=jcvCzMCkRAh_4tlfIUHWnQ",
    "user_name": "Emma F.",
    "user_location": "Los Angeles, CA",
    "user_review_count": 110,
    "user_friend_count": 1,
    "user_photo_count": 102,
    "user_video_count": 0,
    "user_check_in_count": 0,
    "user_elite_years": [
      2026,
      2025,
      2024
    ],
    "user_location_rank_title": "user",
    "has_user_paid_through_yelp": false,
    "user_member_since_unix": 1432335012,
    "user_member_since_formatted": "05/22/2015 10:50 PM",
    "user_photo_url": "https://s3-media0.fl.yelpcdn.com/photo/IWJDE74gM8VLm8_tXi5RAQ/ms.jpg",
    "user_feedback": {
      "cool": false,
      "funny": false,
      "useful": false
    }
  }
]
```

#### 📸 Media (photos/videos)

| Field | Description |
|---|---|
| `business_id` | Links back to the business row |
| `media_type` | `photo` or `video` |
| `media_url` | Full original size URL |
| `media_caption` | Caption text |
| `media_date_unix` / `media_date_formatted` | Upload date, raw and formatted |
| `media_source` | Source tag Yelp attaches to the media, if any |
| `media_duration_seconds` | Video duration, `null` for photos |
| `likes` | Like count |
| `index` | Position of the media item in Yelp's own ordering |
| `author_id` | Yelp user ID of whoever posted the media |
| `author_profile_url` | Direct link to the author's profile |
| `author_name` | Author display name |
| `author_first_name` / `author_last_initial` | Author's name broken out |
| `author_friend_count` | Author's friend count |
| `author_elite_years` | Years the author held Yelp Elite status |
| `author_review_count` | Total reviews written by the author |
| `author_video_count` | Total videos uploaded by the author |
| `author_avatar` | Author's avatar URL |

**Example output:**

```json
[
  {
    "business_id": "1260m1JUUCE4RBrbKgZ8qg",
    "media_type": "photo",
    "media_url": "https://s3-media0.fl.yelpcdn.com/bphoto/948MRgoCgOLwONq09TFm7g/o.jpg",
    "media_caption": "Best place ever. Hit and run in the parking lot at work. They got it done in less than 2 days. Flawless.",
    "media_date_unix": 1506123515,
    "media_date_formatted": "09/22/2017 11:38 PM",
    "media_source": null,
    "media_duration_seconds": null,
    "likes": 4,
    "index": 0,
    "author_id": "hW72YNywr2uxEB6vqFUYkg",
    "author_profile_url": "https://www.yelp.com/user_details?userid=hW72YNywr2uxEB6vqFUYkg",
    "author_name": "Anne H.",
    "author_first_name": "Anne",
    "author_last_initial": "H",
    "author_friend_count": 11,
    "author_elite_years": null,
    "author_review_count": 36,
    "author_video_count": 0,
    "author_avatar": "https://s3-media0.fl.yelpcdn.com/photo/yv6TG-ud5TMW8ILXs53LxA/o.jpg"
  },
  {
    "business_id": "1260m1JUUCE4RBrbKgZ8qg",
    "media_type": "photo",
    "media_url": "https://s3-media0.fl.yelpcdn.com/bphoto/78h3xEE1JYa8FoG0hfnR7Q/o.jpg",
    "media_caption": "before & after ! A++",
    "media_date_unix": 1506386908,
    "media_date_formatted": "09/26/2017 12:48 AM",
    "media_source": null,
    "media_duration_seconds": null,
    "likes": 0,
    "index": 1,
    "author_id": "-Po8Cwff2WAIdBbQpnOZpA",
    "author_profile_url": "https://www.yelp.com/user_details?userid=-Po8Cwff2WAIdBbQpnOZpA",
    "author_name": "T C.",
    "author_first_name": "T",
    "author_last_initial": "C",
    "author_friend_count": 20,
    "author_elite_years": null,
    "author_review_count": 46,
    "author_video_count": 0,
    "author_avatar": null
  },
  {
    "business_id": "1260m1JUUCE4RBrbKgZ8qg",
    "media_type": "photo",
    "media_url": "https://s3-media0.fl.yelpcdn.com/bphoto/ltGRHaCsCxr7hQzK4-SHVQ/o.jpg",
    "media_caption": null,
    "media_date_unix": 1491414702,
    "media_date_formatted": "04/05/2017 05:51 PM",
    "media_source": null,
    "media_duration_seconds": null,
    "likes": 1,
    "index": 2,
    "author_id": null,
    "author_profile_url": null,
    "author_name": null,
    "author_first_name": null,
    "author_last_initial": null,
    "author_friend_count": null,
    "author_elite_years": null,
    "author_review_count": null,
    "author_video_count": null,
    "author_avatar": null
  }
]
```

***

### 💡 Use cases

#### 📞 Local business lead generation

Search by category and location, pull phone numbers, addresses, and websites for every matching business, no manual copy-pasting from Yelp search pages.

#### 🕵️ Reputation monitoring

Scrape reviews for a business or a whole category on a schedule, filter for low ratings, and check for keywords like "refund" or "manager" to catch problems early.

#### 📊 Competitor research

Pull a competitor's reviews and photos, see what customers actually say and what the business looks like inside, not just their star rating.

#### 🔎 Review sentiment and keyword analysis

Use the built in keyword check to flag reviews mentioning specific terms across hundreds of businesses at once, no separate NLP step needed for simple keyword tracking.

#### 🖼️ Media collection

Grab every photo and video from a business's Yelp page in original resolution for cataloging, comparison, or archiving.

***

### 🚀 Getting started via API

#### Python - search by category with reviews, media, and keyword matching

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run_input = {
    "mainMode": "search",
    "searchMode": "category",
    "category": "autorepair",
    "location": "90211",
    "maxResults": 10,
    "scrapeReviews": True,
    "maxReviews": 50,
    "reviewKeywords": ["bad", "good", "friend", "happy"],
    "scrapeMedia": True,
    "maxMedia": 50,
}

run = client.actor("mof1re/yelp-scraper-pro-all-in-one").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["avg_rating"], item["review_count"])
```

#### Python - listing URLs, IDs, and aliases mixed together

```python
run_input = {
    "mainMode": "listing_urls",
    "listingUrls": [
        "https://www.yelp.com/biz/best-bagel-and-coffee-new-york",
        "best-bagel-and-coffee-new-york",
        "j1S3NUrkB3BVT49n_e76NQ",
    ],
    "scrapeBusinessDetails": True,
    "scrapeReviews": True,
    "maxReviews": 100,
    "scrapeMedia": True,
    "maxMedia": 100,
}

run = client.actor("mof1re/yelp-scraper-pro-all-in-one").call(run_input=run_input)
```

#### Python - search by keyword, listing URLs section skipped

```python
run_input = {
    "mainMode": "listing_urls",
    "listingUrls": [
        "https://www.yelp.com/biz/best-bagel-and-coffee-new-york",
        "j1S3NUrkB3BVT49n_e76NQ",
    ],
    "location": "90211",
    "searchQuery": "auto repair service",
    "searchMode": "query",
    "scrapeBusinessDetails": True,
    "scrapeMedia": False,
    "scrapeReviews": True,
    "maxReviews": 100,
}

run = client.actor("mof1re/yelp-scraper-pro-all-in-one").call(run_input=run_input)
```

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('mof1re/yelp-scraper-pro-all-in-one').call({
    mainMode: 'search',
    searchMode: 'category',
    category: 'autorepair',
    location: '90211',
    scrapeReviews: true,
    scrapeMedia: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => console.log(item.name, item.avg_rating));
```

***

### ❓ Frequently asked questions

#### What is a Yelp scraper?

A Yelp scraper extracts business data, reviews, or photos and videos from Yelp automatically, without manually browsing and copying pages one by one.

#### Can this actor scrape Yelp reviews?

Yes. Turn on `scrapeReviews` and every business found gets its reviews pulled, including owner replies, ratings, dates, and any attached photos or videos.

#### Can it scrape Yelp photos and videos?

Yes. Turn on `scrapeMedia` to get every photo and video for a business in original size, with captions, dates, and author info.

#### Is there a limit on how many reviews or photos I can get?

No actor-side limit. You get everything Yelp has for that business, up to whatever `maxReviews` or `maxMedia` you set (or all of it, if you set them to 0).

#### Is there a limit on search results?

Yelp itself caps search and category results at 240. You can work around this by running multiple searches with different sort orders or filters.

#### Do I need to know the exact Yelp category slug?

No. The actor's input form links to the full Yelp category list with copyable slugs, so you don't have to guess.

#### Can I mix URLs, business IDs, and aliases in the same run?

Yes, `listingUrls` accepts all three formats in the same list.

#### Does it use a browser?

No. It's a pure HTTP based scraper built on a full reverse engineering of the Yelp mobile app, so it runs fast without launching a browser.

#### Can I filter reviews by keyword?

Yes. Add your keywords to `reviewKeywords` and each review gets checked locally, with a per-keyword match flag and an overall match flag in the output.

***

### 🔗 See also

Need a scraper for another platform? Check out:

- [Tripadvisor Reviews Scraper](https://apify.com/mof1re/tripadvisor-reviews-scraper)
- [Booking.com Reviews Scraper](https://apify.com/mof1re/booking-reviews-scraper-browserless)
- [AirBnb Reviews Scraper](https://apify.com/mof1re/airbnb-reviews-scraper-browserless)
- [Trustpilot Reviews Scraper](https://apify.com/mof1re/trustpilot-scraper-fast-browserlessapif)
- [ULTA Reviews Scraper](https://apify.com/mof1re/ulta-reviews-scraper)
- [Zillow Listings Scraper](https://apify.com/mof1re/zillow-scraper)

# Actor input Schema

## `mainMode` (type: `string`):

Choose whether to scrape specific listing URLs, or run a search/category scrape. This choice controls which section below is used.

## `listingUrls` (type: `array`):

Yelp business URLs, aliases, or ids to scrape directly.

## `searchMode` (type: `string`):

Search by free-text keyword, or by a fixed Yelp category.

## `searchQuery` (type: `string`):

Keyword to search for. Examples: "computer repair", "coffee shop", "plumber". Used only when Search Mode = "Search Query".

## `category` (type: `string`):

Yelp category slug, e.g. "coffee", "autorepair". Used only when Search Mode = "Category".

## `location` (type: `string`):

City, State, ZIP code, or "City, State" -- e.g. "Newark, DE", "90210", "Beverly Hills, CA".

## `sort` (type: `string`):

Result ordering. Default uses Yelp's recommended sort.

## `openNow` (type: `boolean`):

Only include businesses that are currently open.

## `priceRange` (type: `array`):

Filter by price level ($ to $$$$). Leave empty for no price filtering. Not supported by every category -- if a category doesn't support it, this filter is simply ignored by Yelp.

## `maxResults` (type: `integer`):

Maximum results to fetch per search/category. 0 = all available (Yelp caps at 240 total).

## `scrapeReviews` (type: `boolean`):

Fetch reviews for each business. $

## `maxReviews` (type: `integer`):

Maximum reviews to fetch per business. 0 = max possible.

## `reviewRating` (type: `string`):

Only fetch reviews with this star rating. Leave as "Any" for no filtering.

## `reviewSortBy` (type: `string`):

Review ordering.

## `reviewCutoffDate` (type: `string`):

Only used with "Newest First" or "Oldest First" sorting. Stops fetching further reviews for a business once this date is reached. Leave empty to disable.

## `reviewKeywords` (type: `array`):

Keywords to check for locally in each review's text (checked in the actor, not sent to Yelp). Each review in the output gets a per-keyword true/false flag, plus an overall "any keyword matched" flag. Leave empty to skip.

## `scrapeBusinessDetails` (type: `boolean`):

Fetch full business details for each listing. Only relevant in Listing URLs mode -- in Search / Category mode, full business data is already included automatically.

## `scrapeMedia` (type: `boolean`):

Fetch media(photos and videos) for each business. $

## `maxMedia` (type: `integer`):

Maximum media to fetch per business. 0 = all available.

## Actor input object example

```json
{
  "mainMode": "search",
  "listingUrls": [
    "https://www.yelp.com/biz/best-bagel-and-coffee-new-york",
    "best-bagel-and-coffee-new-york",
    "j1S3NUrkB3BVT49n_e76NQ"
  ],
  "searchMode": "query",
  "searchQuery": "auto repair service",
  "category": "autorepair",
  "location": "90211",
  "sort": "default",
  "openNow": false,
  "priceRange": [],
  "maxResults": 50,
  "scrapeReviews": true,
  "maxReviews": 50,
  "reviewRating": "any",
  "reviewSortBy": "relevance_desc",
  "reviewCutoffDate": "",
  "reviewKeywords": [],
  "scrapeBusinessDetails": false,
  "scrapeMedia": false,
  "maxMedia": 50
}
```

# Actor output Schema

## `businesses` (type: `string`):

Basic business/listing info -- one row per business found (via search/category) or given directly (Listing URLs mode). Includes business details fields too when Scrape Business Details is enabled.

## `reviews` (type: `string`):

One row per review. Includes a business\_id/alias field to join back to the businesses dataset.

## `media` (type: `string`):

One row per media. Includes a business\_id/alias field to join back to the businesses dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "listingUrls": [
        "https://www.yelp.com/biz/best-bagel-and-coffee-new-york",
        "best-bagel-and-coffee-new-york",
        "j1S3NUrkB3BVT49n_e76NQ"
    ],
    "searchQuery": "auto repair service",
    "category": "autorepair",
    "location": "90211",
    "maxReviews": 50,
    "maxMedia": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("mof1re/yelp-scraper-pro-all-in-one").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "listingUrls": [
        "https://www.yelp.com/biz/best-bagel-and-coffee-new-york",
        "best-bagel-and-coffee-new-york",
        "j1S3NUrkB3BVT49n_e76NQ",
    ],
    "searchQuery": "auto repair service",
    "category": "autorepair",
    "location": "90211",
    "maxReviews": 50,
    "maxMedia": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("mof1re/yelp-scraper-pro-all-in-one").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "listingUrls": [
    "https://www.yelp.com/biz/best-bagel-and-coffee-new-york",
    "best-bagel-and-coffee-new-york",
    "j1S3NUrkB3BVT49n_e76NQ"
  ],
  "searchQuery": "auto repair service",
  "category": "autorepair",
  "location": "90211",
  "maxReviews": 50,
  "maxMedia": 50
}' |
apify call mof1re/yelp-scraper-pro-all-in-one --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mof1re/yelp-scraper-pro-all-in-one"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fdkxDSpNTVgx5lIyZ/builds/qb9P2cW6ZIzj5EcZZ/openapi.json
