{
  "data": {
    "id": "7mYG1lPFI7rSncbGE",
    "actId": "CWMtH7pdWHSYg09fK",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-12T09:18:16.994Z",
    "finishedAt": "2026-11-12T09:18:26.085Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9027,
      "runTimeSecs": 9.027,
      "computeUnits": 0.01003,
      "imageSizeBytes": 319288320
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Yelp Business Profile, Hours & Menu Extractor Input\",\n  \"description\": \"Search Yelp by keyword and location or look up specific business URLs, then collect profiles, weekly hours, menus, photos, and reviews.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"Search Yelp by keyword and location, or look up specific business URLs, aliases, or 22-character business IDs.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"direct\"\n      ],\n      \"enumTitles\": [\n        \"Search Yelp by keyword and location\",\n        \"Scrape specific business URLs or IDs\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"direct\",\n      \"sectionCaption\": \"What to scrape\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"Keywords to search for in mode=search, for example 'pizza', 'plumber', or 'coffee shop'. Each query is combined with each location.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"pizza\",\n        \"sushi\"\n      ]\n    },\n    \"locations\": {\n      \"title\": \"Locations\",\n      \"type\": \"array\",\n      \"description\": \"Cities, neighborhoods, or ZIP codes to search in mode=search, for example 'New York, NY' or '10012'.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"New York, NY\",\n        \"Los Angeles, CA\"\n      ]\n    },\n    \"startUrls\": {\n      \"title\": \"Start URLs\",\n      \"type\": \"array\",\n      \"description\": \"In mode=search, paste Yelp search URLs. In mode=direct, paste business URLs, aliases, or 22-character business IDs.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"https://www.yelp.com/biz/prince-street-pizza-new-york-2\"\n      ]\n    },\n    \"categories\": {\n      \"title\": \"Categories\",\n      \"type\": \"array\",\n      \"description\": \"Optional Yelp category aliases or names used to narrow search results, for example 'pizza', 'coffee', or 'home_services'.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"sortBy\": {\n      \"title\": \"Search result order\",\n      \"type\": \"string\",\n      \"description\": \"Ordering for mode=search result pages.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"recommended\",\n        \"rating\",\n        \"reviewCount\"\n      ],\n      \"enumTitles\": [\n        \"Recommended\",\n        \"Highest rated\",\n        \"Most reviewed\"\n      ],\n      \"default\": \"recommended\",\n      \"prefill\": \"recommended\",\n      \"sectionCaption\": \"Search filters\"\n    },\n    \"price\": {\n      \"title\": \"Price levels\",\n      \"type\": \"array\",\n      \"description\": \"Optional price levels for mode=search. Leave empty for every price level.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"$\",\n          \"$$\",\n          \"$$$\",\n          \"$$$$\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"minRating\": {\n      \"title\": \"Minimum rating\",\n      \"type\": \"number\",\n      \"description\": \"Drop businesses rated below this value. Set to 0 to keep every rating.\",\n      \"minimum\": 0,\n      \"maximum\": 5,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum businesses\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on business records in the dataset. Search is limited to Yelp's 240-result ceiling per query.\",\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"default\": 50,\n      \"prefill\": 1\n    },\n    \"includeReviews\": {\n      \"title\": \"Include reviews\",\n      \"type\": \"boolean\",\n      \"description\": \"Turn off to collect only business profiles, hours, and menus and skip the review feed.\",\n      \"default\": true,\n      \"prefill\": true,\n      \"sectionCaption\": \"Reviews and enrichment\"\n    },\n    \"maxReviewsPerBusiness\": {\n      \"title\": \"Reviews per business\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum reviews collected for each business. Reviews are paged 49 at a time from Yelp's public review feed.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 20,\n      \"prefill\": 3\n    },\n    \"reviewSort\": {\n      \"title\": \"Review order\",\n      \"type\": \"string\",\n      \"description\": \"Ordering applied to each business's review feed.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"DATE_DESC\",\n        \"DATE_ASC\",\n        \"RATING_DESC\",\n        \"RATING_ASC\",\n        \"RELEVANCE_DESC\",\n        \"ELITES_DESC\"\n      ],\n      \"enumTitles\": [\n        \"Newest first\",\n        \"Oldest first\",\n        \"Highest rated first\",\n        \"Lowest rated first\",\n        \"Most relevant first\",\n        \"Elite reviewers first\"\n      ],\n      \"default\": \"DATE_DESC\",\n      \"prefill\": \"DATE_DESC\"\n    },\n    \"reviewRatings\": {\n      \"title\": \"Review star ratings\",\n      \"type\": \"array\",\n      \"description\": \"Only collect reviews with these star ratings. Choose one or more values.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\"\n        ]\n      },\n      \"default\": [\n        \"5\",\n        \"4\",\n        \"3\",\n        \"2\",\n        \"1\"\n      ],\n      \"prefill\": [\n        \"5\",\n        \"4\",\n        \"3\",\n        \"2\",\n        \"1\"\n      ]\n    },\n    \"reviewLanguage\": {\n      \"title\": \"Review language\",\n      \"type\": \"string\",\n      \"description\": \"Language for the review feed. Choose 'all' to page through every language Yelp reports for the business.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"pt\",\n        \"nl\",\n        \"sv\",\n        \"da\",\n        \"no\",\n        \"fi\",\n        \"pl\",\n        \"cs\",\n        \"el\",\n        \"tr\",\n        \"ru\",\n        \"uk\",\n        \"he\",\n        \"ar\",\n        \"hi\",\n        \"bn\",\n        \"ta\",\n        \"th\",\n        \"vi\",\n        \"id\",\n        \"ms\",\n        \"tl\",\n        \"zh\",\n        \"ja\",\n        \"ko\"\n      ],\n      \"enumTitles\": [\n        \"All available languages\",\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Dutch\",\n        \"Swedish\",\n        \"Danish\",\n        \"Norwegian\",\n        \"Finnish\",\n        \"Polish\",\n        \"Czech\",\n        \"Greek\",\n        \"Turkish\",\n        \"Russian\",\n        \"Ukrainian\",\n        \"Hebrew\",\n        \"Arabic\",\n        \"Hindi\",\n        \"Bengali\",\n        \"Tamil\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Indonesian\",\n        \"Malay\",\n        \"Tagalog\",\n        \"Chinese\",\n        \"Japanese\",\n        \"Korean\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    },\n    \"includeMenu\": {\n      \"title\": \"Extract menus\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch the public menu page for restaurants and extract sections, dishes, descriptions, and prices.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeHours\": {\n      \"title\": \"Extract hours\",\n      \"type\": \"boolean\",\n      \"description\": \"Include weekly opening hours in each business record.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"maxPhotos\": {\n      \"title\": \"Photos per business\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum gallery photos per business (0-100). Set to 0 to skip photos.\",\n      \"minimum\": 0,\n      \"maximum\": 100,\n      \"default\": 100,\n      \"prefill\": 20\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor automatically uses Apify Proxy when Yelp blocks a request; add a country or custom proxy here only when you need a specific route.\",\n      \"editor\": \"proxy\",\n      \"sectionCaption\": \"Advanced\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Yelp Business Profile, Hours & Menu Extractor\n\nYelp business pages are useful for more than star ratings. This actor collects the profile itself — address, phone, website, categories, price level, weekly opening hours — plus the published menu with dish names, descriptions, prices, and sections. Reviews, photo galleries, owner replies, and search metadata are included alongside the profile so one run can feed a directory, a competitive analysis, or a menu-price monitor.\n\n## What it collects\n\n- **Two ways to start.** Search Yelp by keyword and location, or paste business URLs, aliases, or 22-character Yelp business IDs.\n- **Full business profile.** Name, stable business ID, alias, categories, business type, cuisine, address, coordinates, price level, phone, website, claim status, and a short description.\n- **Weekly hours.** Opening hours for each day of the week, including split shifts such as lunch and dinner service.\n- **Menus.** Section names, dish names, descriptions, prices, currencies, and item URLs from the business's public Yelp menu. Menus are optional and appear only when the business has published one.\n- **Photos.** Up to 100 gallery photos per business, with a legacy `photoCategories` grouping for older integrations.\n- **Reviews.** Rating, text, author, date, language, photos, Elite status, reaction counts, and owner replies. The review feed is paged, so you can collect far more than the handful Yelp shows on the first screen.\n- **Search context.** Organic rank, sponsored flag, the query and location that found each business, and the source page.\n- **Honest status rows.** Missing pages, blocks, and data-contract changes become explicit records instead of a silently empty dataset.\n- **No empty placeholders.** Fields Yelp does not provide are omitted at every depth.\n\n## Data source and access\n\nThe actor reads Yelp's public search pages, public menu pages, and the same unauthenticated GraphQL endpoint the website uses. It needs no Yelp account, login, cookie, or API key. When Yelp blocks a request, the actor retries through Apify Proxy automatically; you do not have to configure a proxy.\n\n## Output\n\nEach business is one row with `recordType: \"business\"`. Reviews and menu items are nested arrays.\n\n### Business fields\n\n| Field | Description |\n|---|---|\n| `businessId` / `encId` | Yelp's 22-character business ID |\n| `alias` | Yelp URL slug, for example `prince-street-pizza-new-york-2` |\n| `name` | Business name |\n| `type` | Business type derived from Yelp's root category, e.g. `Restaurant` |\n| `categories` | Category titles |\n| `categoryAliases` | Yelp category aliases |\n| `cuisine` | Cuisine-style categories for restaurants |\n| `address` | Nested address object: `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`, `addressCountry`, `formatted` |\n| `city`, `state`, `zip`, `country` | Flattened address components |\n| `lat`, `lng` | Coordinates |\n| `coordinates` | `{ latitude, longitude }` legacy object |\n| `rating` | Average star rating |\n| `reviewCount` | Review total shown on the profile |\n| `reviewsTotal` | Reviews available in the public feed |\n| `price` / `priceRange` | Price level such as `$` or `$$` |\n| `phone` | Business phone |\n| `website` | Business website |\n| `hours` | Weekly hours keyed by short day name, each value an array of time ranges |\n| `photos` / `images` | Gallery photo URLs |\n| `photoCategories` | `{ \"all\": [...] }` compatibility grouping |\n| `menu` | Menu items (see below) |\n| `isClosed` | Whether Yelp marks the business as closed |\n| `isClaimed` | Whether the profile is claimed |\n| `claimStatus` | `claimed` or `unclaimed` |\n| `description` | Short Yelp summary |\n| `reviews` | Review objects |\n| `ownerReplies` | Owner replies flattened from reviews: `reviewId`, `reviewDate`, `reply`, `replyDate`, `author` |\n| `url` / `directUrl` | Yelp business page URL |\n| `bizId` | Legacy alias of `alias` |\n| `aggregatedRating` | Legacy rating as text |\n| `searchRank` | Organic position in search mode |\n| `sponsored` | Whether the card first appeared as sponsored |\n| `searchQuery`, `searchLocation`, `searchCategory` | Search context |\n| `sourceUrl` | Page the record came from |\n| `scrapedAt` | ISO timestamp |\n\n### Menu items\n\nEach entry in `menu` contains:\n\n| Field | Description |\n|---|---|\n| `section` | Menu section, e.g. `Pizza`, `Desserts`, `Drinks` |\n| `name` | Dish name |\n| `description` | Dish description when published |\n| `price` | Display price, e.g. `$38.50` |\n| `priceValue` | Numeric price for sorting and comparison |\n| `priceCurrency` | ISO currency code, e.g. `USD` |\n| `url` | Yelp menu-item URL |\n\n### Reviews\n\nReview objects keep both the current field names and the older pro-actor aliases:\n\n`id`/`reviewId`, `rating`, `text`, `author`/`reviewerName`, `authorId`, `authorUrl`, `authorLocation`, `authorReviewCount`, `date`, `dateLocal`, `photos`, `ownerReply`, `elite`, `eliteYear`, `language`, `isFirstReview`, `checkInCount`, `reactions`, `isUsefulCount`, `isFunnyCount`, `isCoolCount`.\n\n### Status rows\n\nA row with `recordType: \"status\"` explains anything that prevented collection:\n\n- `status`: `not_found`, `blocked`, `api_drift`, `no_results`, or `invalid_input`\n- `message`: plain-language explanation\n- `sourceUrl`, `businessId`, `operation`, and `documentId` when relevant\n- `scrapedAt`\n\nFilter on `recordType` before loading business rows.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search` for keyword discovery, `direct` for specific businesses |\n| `searchQueries` | array | `[]` | Keywords for `mode=search`; each is combined with each location |\n| `locations` | array | `[]` | Cities, neighborhoods, or ZIP codes for `mode=search` |\n| `startUrls` | array | `[]` | Yelp search URLs in `search` mode, or business URLs, aliases, and IDs in `direct` mode |\n| `categories` | array | `[]` | Yelp category names or aliases |\n| `sortBy` | string | `recommended` | `recommended`, `rating`, or `reviewCount` |\n| `price` | array | `[]` | `$`, `$$`, `$$$`, `$$$$` |\n| `minRating` | number | `0` | Drop businesses below this rating |\n| `maxItems` | integer | `50` | Maximum business rows (1–500) |\n| `includeReviews` | boolean | `true` | Turn off to skip the review feed |\n| `maxReviewsPerBusiness` | integer | `20` | Reviews per business (1–1000) |\n| `reviewSort` | string | `DATE_DESC` | Review ordering |\n| `reviewRatings` | array | `[\"5\",\"4\",\"3\",\"2\",\"1\"]` | Star ratings to include |\n| `reviewLanguage` | string | `en` | Review language, or `all` for every language Yelp reports |\n| `includeMenu` | boolean | `true` | Fetch and parse published menus |\n| `includeHours` | boolean | `true` | Include weekly hours |\n| `maxPhotos` | integer | `100` | Gallery photos per business (0–100) |\n| `proxyConfiguration` | object | automatic | Optional route override; no proxy setup is required |\n\n### Legacy input keys\n\nSaved tasks from the previous version keep working. The actor reads the old keys in code and maps them to the new options; they are not shown in the input form:\n\n| Old key | New option |\n|---|---|\n| `searchTerms` | `searchQueries` |\n| `searchQuery` / `searchSort` | `searchQueries` / `sortBy` |\n| `locations` / `location` | `locations` |\n| `directUrls` / `searchUrls` | `startUrls` |\n| `searchLimit` | `maxItems` |\n| `reviewLimit` | `maxReviewsPerBusiness`; `0` turns reviews off |\n| `searchPrice` / `searchCategory` | `price` / `categories` |\n| `fetchMenu` | `includeMenu` |\n| `fetchHours` | `includeHours` |\n| `fetchPhotos` / `maxPhotos` | `maxPhotos` |\n| `proxy` | `proxyConfiguration` |\n| `runTimeoutSecs` | Ignored; row caps bound each run |\n\n### Example: search with menus and hours\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"pizza\"],\n  \"locations\": [\"New York, NY\"],\n  \"minRating\": 4,\n  \"maxItems\": 10,\n  \"includeMenu\": true,\n  \"includeHours\": true,\n  \"maxReviewsPerBusiness\": 10\n}\n```\n\n### Example: exact businesses with deep reviews\n\n```json\n{\n  \"mode\": \"direct\",\n  \"startUrls\": [\n    \"https://www.yelp.com/biz/prince-street-pizza-new-york-2\",\n    \"https://www.yelp.com/biz/joes-pizza-new-york-148\"\n  ],\n  \"includeMenu\": true,\n  \"maxReviewsPerBusiness\": 100,\n  \"reviewSort\": \"RATING_DESC\",\n  \"maxPhotos\": 100\n}\n```\n\n### Example: profiles and menus only\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"ramen\"],\n  \"locations\": [\"Seattle, WA\"],\n  \"includeReviews\": false,\n  \"maxItems\": 25\n}\n```\n\n## Use cases\n\n- Build a local-business directory with hours, contact data, and coordinates.\n- Monitor menu prices and dish changes across restaurant competitors.\n- Compare ratings, review volume, and price levels in a market.\n- Export reviews with owner responses for sentiment and service analysis.\n- Enrich CRM or mapping data with stable Yelp business IDs.\n- Track search ranking and sponsored placement for target keywords.\n\n## FAQ\n\n**Do I need a proxy or a Yelp account?**\nNo. The actor uses public pages and an unauthenticated endpoint. It routes through Apify Proxy automatically when Yelp blocks a request, and you can leave `proxyConfiguration` empty.\n\n**Why is `menu` missing for some restaurants?**\nYelp only publishes menus for businesses that added one, mostly US restaurants. The actor checks the public menu page and omits `menu` when there is nothing to parse.\n\n**How many search results can I get?**\nYelp caps a single search at 240 results, ten per page. `maxItems` can go up to 500 across multiple queries, locations, or direct URLs.\n\n**How deep can reviews go?**\nUp to 1,000 per business. The feed is requested in pages of 49, so deeper runs use more requests.\n\n**Why is `reviewsTotal` lower than `reviewCount`?**\nYelp's public review feed excludes reviews it does not recommend, so the feed total can be slightly below the profile count.\n\n**Are hours and menus live?**\nYes. Every run reads the current public page and menu. Yelp does not expose historical hours or menu versions.\n\n**What happens when Yelp changes its format?**\nThe actor writes an `api_drift` status row with the operation and source URL instead of returning an empty dataset. The run status message also reports it.\n\n**Can I search outside the US?**\nYes. Yelp search and business pages work across its supported markets. Menu coverage is lower outside the US.\n\n## Limitations\n\n- A single search stops at Yelp's 240-result ceiling. Split by neighborhood or category for more.\n- The public review feed leaves out not-recommended reviews.\n- Menus are published voluntarily; businesses without a menu simply have no `menu` key.\n- Amenity/service lists from the old page layout are not part of Yelp's public GraphQL contract and are not included.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "yelp-business-profile-hours-and-menu-extractor",
      "title": "Yelp Business Profile, Hours & Menu Extractor",
      "description": "Collect Yelp business profiles, weekly opening hours, full menus with prices, photo galleries, owner replies, contact details, and reviews by keyword search or direct business URL.",
      "version": "2.0",
      "dockerfile": "../Dockerfile",
      "readme": "# Yelp Business Profile, Hours & Menu Extractor\n\nYelp business pages are useful for more than star ratings. This actor collects the profile itself — address, phone, website, categories, price level, weekly opening hours — plus the published menu with dish names, descriptions, prices, and sections. Reviews, photo galleries, owner replies, and search metadata are included alongside the profile so one run can feed a directory, a competitive analysis, or a menu-price monitor.\n\n## What it collects\n\n- **Two ways to start.** Search Yelp by keyword and location, or paste business URLs, aliases, or 22-character Yelp business IDs.\n- **Full business profile.** Name, stable business ID, alias, categories, business type, cuisine, address, coordinates, price level, phone, website, claim status, and a short description.\n- **Weekly hours.** Opening hours for each day of the week, including split shifts such as lunch and dinner service.\n- **Menus.** Section names, dish names, descriptions, prices, currencies, and item URLs from the business's public Yelp menu. Menus are optional and appear only when the business has published one.\n- **Photos.** Up to 100 gallery photos per business, with a legacy `photoCategories` grouping for older integrations.\n- **Reviews.** Rating, text, author, date, language, photos, Elite status, reaction counts, and owner replies. The review feed is paged, so you can collect far more than the handful Yelp shows on the first screen.\n- **Search context.** Organic rank, sponsored flag, the query and location that found each business, and the source page.\n- **Honest status rows.** Missing pages, blocks, and data-contract changes become explicit records instead of a silently empty dataset.\n- **No empty placeholders.** Fields Yelp does not provide are omitted at every depth.\n\n## Data source and access\n\nThe actor reads Yelp's public search pages, public menu pages, and the same unauthenticated GraphQL endpoint the website uses. It needs no Yelp account, login, cookie, or API key. When Yelp blocks a request, the actor retries through Apify Proxy automatically; you do not have to configure a proxy.\n\n## Output\n\nEach business is one row with `recordType: \"business\"`. Reviews and menu items are nested arrays.\n\n### Business fields\n\n| Field | Description |\n|---|---|\n| `businessId` / `encId` | Yelp's 22-character business ID |\n| `alias` | Yelp URL slug, for example `prince-street-pizza-new-york-2` |\n| `name` | Business name |\n| `type` | Business type derived from Yelp's root category, e.g. `Restaurant` |\n| `categories` | Category titles |\n| `categoryAliases` | Yelp category aliases |\n| `cuisine` | Cuisine-style categories for restaurants |\n| `address` | Nested address object: `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`, `addressCountry`, `formatted` |\n| `city`, `state`, `zip`, `country` | Flattened address components |\n| `lat`, `lng` | Coordinates |\n| `coordinates` | `{ latitude, longitude }` legacy object |\n| `rating` | Average star rating |\n| `reviewCount` | Review total shown on the profile |\n| `reviewsTotal` | Reviews available in the public feed |\n| `price` / `priceRange` | Price level such as `$` or `$$` |\n| `phone` | Business phone |\n| `website` | Business website |\n| `hours` | Weekly hours keyed by short day name, each value an array of time ranges |\n| `photos` / `images` | Gallery photo URLs |\n| `photoCategories` | `{ \"all\": [...] }` compatibility grouping |\n| `menu` | Menu items (see below) |\n| `isClosed` | Whether Yelp marks the business as closed |\n| `isClaimed` | Whether the profile is claimed |\n| `claimStatus` | `claimed` or `unclaimed` |\n| `description` | Short Yelp summary |\n| `reviews` | Review objects |\n| `ownerReplies` | Owner replies flattened from reviews: `reviewId`, `reviewDate`, `reply`, `replyDate`, `author` |\n| `url` / `directUrl` | Yelp business page URL |\n| `bizId` | Legacy alias of `alias` |\n| `aggregatedRating` | Legacy rating as text |\n| `searchRank` | Organic position in search mode |\n| `sponsored` | Whether the card first appeared as sponsored |\n| `searchQuery`, `searchLocation`, `searchCategory` | Search context |\n| `sourceUrl` | Page the record came from |\n| `scrapedAt` | ISO timestamp |\n\n### Menu items\n\nEach entry in `menu` contains:\n\n| Field | Description |\n|---|---|\n| `section` | Menu section, e.g. `Pizza`, `Desserts`, `Drinks` |\n| `name` | Dish name |\n| `description` | Dish description when published |\n| `price` | Display price, e.g. `$38.50` |\n| `priceValue` | Numeric price for sorting and comparison |\n| `priceCurrency` | ISO currency code, e.g. `USD` |\n| `url` | Yelp menu-item URL |\n\n### Reviews\n\nReview objects keep both the current field names and the older pro-actor aliases:\n\n`id`/`reviewId`, `rating`, `text`, `author`/`reviewerName`, `authorId`, `authorUrl`, `authorLocation`, `authorReviewCount`, `date`, `dateLocal`, `photos`, `ownerReply`, `elite`, `eliteYear`, `language`, `isFirstReview`, `checkInCount`, `reactions`, `isUsefulCount`, `isFunnyCount`, `isCoolCount`.\n\n### Status rows\n\nA row with `recordType: \"status\"` explains anything that prevented collection:\n\n- `status`: `not_found`, `blocked`, `api_drift`, `no_results`, or `invalid_input`\n- `message`: plain-language explanation\n- `sourceUrl`, `businessId`, `operation`, and `documentId` when relevant\n- `scrapedAt`\n\nFilter on `recordType` before loading business rows.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search` for keyword discovery, `direct` for specific businesses |\n| `searchQueries` | array | `[]` | Keywords for `mode=search`; each is combined with each location |\n| `locations` | array | `[]` | Cities, neighborhoods, or ZIP codes for `mode=search` |\n| `startUrls` | array | `[]` | Yelp search URLs in `search` mode, or business URLs, aliases, and IDs in `direct` mode |\n| `categories` | array | `[]` | Yelp category names or aliases |\n| `sortBy` | string | `recommended` | `recommended`, `rating`, or `reviewCount` |\n| `price` | array | `[]` | `$`, `$$`, `$$$`, `$$$$` |\n| `minRating` | number | `0` | Drop businesses below this rating |\n| `maxItems` | integer | `50` | Maximum business rows (1–500) |\n| `includeReviews` | boolean | `true` | Turn off to skip the review feed |\n| `maxReviewsPerBusiness` | integer | `20` | Reviews per business (1–1000) |\n| `reviewSort` | string | `DATE_DESC` | Review ordering |\n| `reviewRatings` | array | `[\"5\",\"4\",\"3\",\"2\",\"1\"]` | Star ratings to include |\n| `reviewLanguage` | string | `en` | Review language, or `all` for every language Yelp reports |\n| `includeMenu` | boolean | `true` | Fetch and parse published menus |\n| `includeHours` | boolean | `true` | Include weekly hours |\n| `maxPhotos` | integer | `100` | Gallery photos per business (0–100) |\n| `proxyConfiguration` | object | automatic | Optional route override; no proxy setup is required |\n\n### Legacy input keys\n\nSaved tasks from the previous version keep working. The actor reads the old keys in code and maps them to the new options; they are not shown in the input form:\n\n| Old key | New option |\n|---|---|\n| `searchTerms` | `searchQueries` |\n| `searchQuery` / `searchSort` | `searchQueries` / `sortBy` |\n| `locations` / `location` | `locations` |\n| `directUrls` / `searchUrls` | `startUrls` |\n| `searchLimit` | `maxItems` |\n| `reviewLimit` | `maxReviewsPerBusiness`; `0` turns reviews off |\n| `searchPrice` / `searchCategory` | `price` / `categories` |\n| `fetchMenu` | `includeMenu` |\n| `fetchHours` | `includeHours` |\n| `fetchPhotos` / `maxPhotos` | `maxPhotos` |\n| `proxy` | `proxyConfiguration` |\n| `runTimeoutSecs` | Ignored; row caps bound each run |\n\n### Example: search with menus and hours\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"pizza\"],\n  \"locations\": [\"New York, NY\"],\n  \"minRating\": 4,\n  \"maxItems\": 10,\n  \"includeMenu\": true,\n  \"includeHours\": true,\n  \"maxReviewsPerBusiness\": 10\n}\n```\n\n### Example: exact businesses with deep reviews\n\n```json\n{\n  \"mode\": \"direct\",\n  \"startUrls\": [\n    \"https://www.yelp.com/biz/prince-street-pizza-new-york-2\",\n    \"https://www.yelp.com/biz/joes-pizza-new-york-148\"\n  ],\n  \"includeMenu\": true,\n  \"maxReviewsPerBusiness\": 100,\n  \"reviewSort\": \"RATING_DESC\",\n  \"maxPhotos\": 100\n}\n```\n\n### Example: profiles and menus only\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"ramen\"],\n  \"locations\": [\"Seattle, WA\"],\n  \"includeReviews\": false,\n  \"maxItems\": 25\n}\n```\n\n## Use cases\n\n- Build a local-business directory with hours, contact data, and coordinates.\n- Monitor menu prices and dish changes across restaurant competitors.\n- Compare ratings, review volume, and price levels in a market.\n- Export reviews with owner responses for sentiment and service analysis.\n- Enrich CRM or mapping data with stable Yelp business IDs.\n- Track search ranking and sponsored placement for target keywords.\n\n## FAQ\n\n**Do I need a proxy or a Yelp account?**\nNo. The actor uses public pages and an unauthenticated endpoint. It routes through Apify Proxy automatically when Yelp blocks a request, and you can leave `proxyConfiguration` empty.\n\n**Why is `menu` missing for some restaurants?**\nYelp only publishes menus for businesses that added one, mostly US restaurants. The actor checks the public menu page and omits `menu` when there is nothing to parse.\n\n**How many search results can I get?**\nYelp caps a single search at 240 results, ten per page. `maxItems` can go up to 500 across multiple queries, locations, or direct URLs.\n\n**How deep can reviews go?**\nUp to 1,000 per business. The feed is requested in pages of 49, so deeper runs use more requests.\n\n**Why is `reviewsTotal` lower than `reviewCount`?**\nYelp's public review feed excludes reviews it does not recommend, so the feed total can be slightly below the profile count.\n\n**Are hours and menus live?**\nYes. Every run reads the current public page and menu. Yelp does not expose historical hours or menu versions.\n\n**What happens when Yelp changes its format?**\nThe actor writes an `api_drift` status row with the operation and source URL instead of returning an empty dataset. The run status message also reports it.\n\n**Can I search outside the US?**\nYes. Yelp search and business pages work across its supported markets. Menu coverage is lower outside the US.\n\n## Limitations\n\n- A single search stops at Yelp's 240-result ceiling. Split by neighborhood or category for more.\n- The public review feed leaves out not-recommended reviews.\n- Menus are published voluntarily; businesses without a menu simply have no `menu` key.\n- Amenity/service lists from the old page layout are not part of Yelp's public GraphQL contract and are not included.\n",
      "input": {
        "title": "Yelp Business Profile, Hours & Menu Extractor Input",
        "description": "Search Yelp by keyword and location or look up specific business URLs, then collect profiles, weekly hours, menus, photos, and reviews.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "Search Yelp by keyword and location, or look up specific business URLs, aliases, or 22-character business IDs.",
            "editor": "select",
            "enum": [
              "search",
              "direct"
            ],
            "enumTitles": [
              "Search Yelp by keyword and location",
              "Scrape specific business URLs or IDs"
            ],
            "default": "search",
            "prefill": "direct",
            "sectionCaption": "What to scrape"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Keywords to search for in mode=search, for example 'pizza', 'plumber', or 'coffee shop'. Each query is combined with each location.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "pizza",
              "sushi"
            ]
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities, neighborhoods, or ZIP codes to search in mode=search, for example 'New York, NY' or '10012'.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "New York, NY",
              "Los Angeles, CA"
            ]
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "In mode=search, paste Yelp search URLs. In mode=direct, paste business URLs, aliases, or 22-character business IDs.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "https://www.yelp.com/biz/prince-street-pizza-new-york-2"
            ]
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Optional Yelp category aliases or names used to narrow search results, for example 'pizza', 'coffee', or 'home_services'.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "sortBy": {
            "title": "Search result order",
            "type": "string",
            "description": "Ordering for mode=search result pages.",
            "editor": "select",
            "enum": [
              "recommended",
              "rating",
              "reviewCount"
            ],
            "enumTitles": [
              "Recommended",
              "Highest rated",
              "Most reviewed"
            ],
            "default": "recommended",
            "prefill": "recommended",
            "sectionCaption": "Search filters"
          },
          "price": {
            "title": "Price levels",
            "type": "array",
            "description": "Optional price levels for mode=search. Leave empty for every price level.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "$",
                "$$",
                "$$$",
                "$$$$"
              ]
            },
            "default": [],
            "prefill": []
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "number",
            "description": "Drop businesses rated below this value. Set to 0 to keep every rating.",
            "minimum": 0,
            "maximum": 5,
            "default": 0,
            "prefill": 0
          },
          "maxItems": {
            "title": "Maximum businesses",
            "type": "integer",
            "description": "Hard cap on business records in the dataset. Search is limited to Yelp's 240-result ceiling per query.",
            "minimum": 1,
            "maximum": 500,
            "default": 50,
            "prefill": 1
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Turn off to collect only business profiles, hours, and menus and skip the review feed.",
            "default": true,
            "prefill": true,
            "sectionCaption": "Reviews and enrichment"
          },
          "maxReviewsPerBusiness": {
            "title": "Reviews per business",
            "type": "integer",
            "description": "Maximum reviews collected for each business. Reviews are paged 49 at a time from Yelp's public review feed.",
            "minimum": 1,
            "maximum": 1000,
            "default": 20,
            "prefill": 3
          },
          "reviewSort": {
            "title": "Review order",
            "type": "string",
            "description": "Ordering applied to each business's review feed.",
            "editor": "select",
            "enum": [
              "DATE_DESC",
              "DATE_ASC",
              "RATING_DESC",
              "RATING_ASC",
              "RELEVANCE_DESC",
              "ELITES_DESC"
            ],
            "enumTitles": [
              "Newest first",
              "Oldest first",
              "Highest rated first",
              "Lowest rated first",
              "Most relevant first",
              "Elite reviewers first"
            ],
            "default": "DATE_DESC",
            "prefill": "DATE_DESC"
          },
          "reviewRatings": {
            "title": "Review star ratings",
            "type": "array",
            "description": "Only collect reviews with these star ratings. Choose one or more values.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            },
            "default": [
              "5",
              "4",
              "3",
              "2",
              "1"
            ],
            "prefill": [
              "5",
              "4",
              "3",
              "2",
              "1"
            ]
          },
          "reviewLanguage": {
            "title": "Review language",
            "type": "string",
            "description": "Language for the review feed. Choose 'all' to page through every language Yelp reports for the business.",
            "editor": "select",
            "enum": [
              "all",
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "nl",
              "sv",
              "da",
              "no",
              "fi",
              "pl",
              "cs",
              "el",
              "tr",
              "ru",
              "uk",
              "he",
              "ar",
              "hi",
              "bn",
              "ta",
              "th",
              "vi",
              "id",
              "ms",
              "tl",
              "zh",
              "ja",
              "ko"
            ],
            "enumTitles": [
              "All available languages",
              "English",
              "Spanish",
              "French",
              "German",
              "Italian",
              "Portuguese",
              "Dutch",
              "Swedish",
              "Danish",
              "Norwegian",
              "Finnish",
              "Polish",
              "Czech",
              "Greek",
              "Turkish",
              "Russian",
              "Ukrainian",
              "Hebrew",
              "Arabic",
              "Hindi",
              "Bengali",
              "Tamil",
              "Thai",
              "Vietnamese",
              "Indonesian",
              "Malay",
              "Tagalog",
              "Chinese",
              "Japanese",
              "Korean"
            ],
            "default": "en",
            "prefill": "en"
          },
          "includeMenu": {
            "title": "Extract menus",
            "type": "boolean",
            "description": "Fetch the public menu page for restaurants and extract sections, dishes, descriptions, and prices.",
            "default": true,
            "prefill": true
          },
          "includeHours": {
            "title": "Extract hours",
            "type": "boolean",
            "description": "Include weekly opening hours in each business record.",
            "default": true,
            "prefill": true
          },
          "maxPhotos": {
            "title": "Photos per business",
            "type": "integer",
            "description": "Maximum gallery photos per business (0-100). Set to 0 to skip photos.",
            "minimum": 0,
            "maximum": 100,
            "default": 100,
            "prefill": 20
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. The actor automatically uses Apify Proxy when Yelp blocks a request; add a country or custom proxy here only when you need a specific route.",
            "editor": "proxy",
            "sectionCaption": "Advanced"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Yelp Business Profile, Hours & Menu Extractor Output",
        "description": "Dataset of Yelp business records with profiles, weekly hours, menus, photo galleries, owner replies, coordinates, claim status, and reviews.",
        "properties": {
          "businesses": {
            "type": "string",
            "title": "Yelp Business Profiles, Hours & Menus",
            "description": "Dataset containing Yelp business records with profiles, hours, menus, photos, owner replies, and reviews, plus explicit status records for missing or blocked targets.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Yelp Business Profiles, Hours & Menus",
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "name",
                  "type",
                  "aggregatedRating",
                  "reviewCount",
                  "priceRange",
                  "phone",
                  "claimStatus",
                  "menu"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "type": {
                    "label": "Type",
                    "format": "text"
                  },
                  "aggregatedRating": {
                    "label": "Rating",
                    "format": "text"
                  },
                  "reviewCount": {
                    "label": "Reviews",
                    "format": "text"
                  },
                  "priceRange": {
                    "label": "Price",
                    "format": "text"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "claimStatus": {
                    "label": "Claim Status",
                    "format": "text"
                  },
                  "menu": {
                    "label": "Menu Items",
                    "format": "array"
                  }
                }
              }
            },
            "detailed": {
              "title": "Detailed",
              "transformation": {
                "fields": [
                  "directUrl",
                  "businessId",
                  "encId",
                  "alias",
                  "name",
                  "type",
                  "description",
                  "categories",
                  "phone",
                  "reviewCount",
                  "aggregatedRating",
                  "priceRange",
                  "cuisine",
                  "website",
                  "images",
                  "address",
                  "coordinates",
                  "hours",
                  "menu",
                  "claimStatus",
                  "ownerReplies",
                  "reviews",
                  "searchRank",
                  "sponsored",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "directUrl": {
                    "label": "URL",
                    "format": "link"
                  },
                  "businessId": {
                    "label": "Business ID",
                    "format": "text"
                  },
                  "encId": {
                    "label": "Encoded ID",
                    "format": "text"
                  },
                  "alias": {
                    "label": "Alias",
                    "format": "text"
                  },
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "type": {
                    "label": "Type",
                    "format": "text"
                  },
                  "description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "categories": {
                    "label": "Categories",
                    "format": "array"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "reviewCount": {
                    "label": "Reviews",
                    "format": "text"
                  },
                  "aggregatedRating": {
                    "label": "Rating",
                    "format": "text"
                  },
                  "priceRange": {
                    "label": "Price",
                    "format": "text"
                  },
                  "cuisine": {
                    "label": "Cuisine",
                    "format": "text"
                  },
                  "website": {
                    "label": "Website",
                    "format": "link"
                  },
                  "images": {
                    "label": "Images",
                    "format": "array"
                  },
                  "address": {
                    "label": "Address",
                    "format": "object"
                  },
                  "coordinates": {
                    "label": "Coordinates",
                    "format": "object"
                  },
                  "hours": {
                    "label": "Hours",
                    "format": "object"
                  },
                  "menu": {
                    "label": "Menu",
                    "format": "array"
                  },
                  "claimStatus": {
                    "label": "Claim Status",
                    "format": "text"
                  },
                  "ownerReplies": {
                    "label": "Owner Replies",
                    "format": "array"
                  },
                  "reviews": {
                    "label": "Reviews",
                    "format": "array"
                  },
                  "searchRank": {
                    "label": "Search Rank",
                    "format": "text"
                  },
                  "sponsored": {
                    "label": "Sponsored",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.0.1",
    "imageDigest": "7b9f039b00d1a44d8162d071eaa213e70957fa78beff7d4e83b81a67a0fc75b4",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.01003
    }
  }
}