{
  "data": {
    "id": "afN7oVipaRHfge5Pm",
    "actId": "tXaH53j6e7DJ08To5",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-05T04:04:25.076Z",
    "finishedAt": "2026-11-05T04:05:00.930Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 35749,
      "runTimeSecs": 35.749,
      "computeUnits": 0.03972111111111111,
      "imageSizeBytes": 3112479232
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Maps Restaurant Menu Scraper Input\",\n  \"description\": \"Choose restaurant menus by Google Maps place URL/ID or search by cuisine and city, then collect dishes, sections, descriptions, prices and place context.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"How to choose restaurants: paste place URLs/IDs or run a Google Maps search query.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"byPlace\",\n        \"bySearch\"\n      ],\n      \"enumTitles\": [\n        \"Restaurants by URL or Place ID\",\n        \"Restaurants by search query\"\n      ],\n      \"default\": \"byPlace\",\n      \"prefill\": \"byPlace\"\n    },\n    \"placeUrls\": {\n      \"title\": \"Place URLs or Place IDs\",\n      \"type\": \"array\",\n      \"description\": \"One restaurant per line (mode=byPlace). Accepts Google Maps place URLs, short maps.app.goo.gl links, canonical ChIJ Place IDs, and 0x…:0x… feature IDs.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": [\n        \"https://www.google.com/maps/place/Sicily+Osteria/@40.7601601,-73.9891863,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25932322b79d3:0x7c085aeae6751161!8m2!3d40.7601601!4d-73.9891863\"\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"Cuisine + city queries, e.g. `italian restaurant, New York` or `sushi in Austin` (mode=bySearch). Each query returns up to Max places per query.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"maxPlacesPerQuery\": {\n      \"title\": \"Max places per query\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum restaurants to process from each search query (mode=bySearch).\",\n      \"minimum\": 1,\n      \"maximum\": 120,\n      \"default\": 20,\n      \"prefill\": 1\n    },\n    \"maxItemsPerPlace\": {\n      \"title\": \"Max items per place\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum menu rows to return for each restaurant.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 100,\n      \"prefill\": 3\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language used for Google Maps place lookups and search results.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"pt\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"ar\",\n        \"ru\",\n        \"nl\",\n        \"pl\",\n        \"tr\",\n        \"sv\",\n        \"da\",\n        \"no\",\n        \"fi\",\n        \"cs\",\n        \"el\",\n        \"he\",\n        \"hi\",\n        \"th\",\n        \"vi\",\n        \"id\",\n        \"uk\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese\",\n        \"Arabic\",\n        \"Russian\",\n        \"Dutch\",\n        \"Polish\",\n        \"Turkish\",\n        \"Swedish\",\n        \"Danish\",\n        \"Norwegian\",\n        \"Finnish\",\n        \"Czech\",\n        \"Greek\",\n        \"Hebrew\",\n        \"Hindi\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Indonesian\",\n        \"Ukrainian\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    },\n    \"includePlacesWithoutMenu\": {\n      \"title\": \"Include places without a menu\",\n      \"type\": \"boolean\",\n      \"description\": \"Return one summary row for a restaurant whose menu cannot be read, so every input place is accounted for.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includePopularDishes\": {\n      \"title\": \"Include popular dishes\",\n      \"type\": \"boolean\",\n      \"description\": \"Also check Google's own inline menu when it is available and mark dishes Google labels Popular. This uses a browser and is slower.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Google Maps Restaurant Menu & Price Scraper\n\nScrape restaurant menus from **Google Maps** and the restaurant's own public menu page. Paste one or many place URLs, or search by cuisine and city, and get one row per dish with its section, description, price, currency, photo, menu provenance, and the full place context — address, rating, review count, categories, website and coordinates. No login, API key or proxy setup is required.\n\n## What this actor does\n\n- **Two modes:** `byPlace` (Maps URL, short link, Place ID or feature ID) and `bySearch` (cuisine + city query)\n- **Batch-ready:** process many restaurants in one run, with a separate item cap per place\n- **Dish-level data:** menu section, item name, description, price text, numeric price and currency\n- **Menu provenance:** `menuSource`, `menuProvider`, the menu URL and the sections found for each restaurant\n- **Place context on every row:** address, rating, review count, price level, categories, website, latitude and longitude\n- **Honest no-menu rows:** when a place has no readable menu, one summary row records the place instead of inventing items\n- Empty or unavailable fields are omitted from each row rather than sent as `null`\n\n## Output per menu item (`recordType: \"menuItem\"`)\n\n- `businessName`, `placeId`, `featureId`, `placeUrl`\n- `placeAddress`, `placeRating`, `placeReviewCount`, `placePriceLevel`\n- `placeCategories[]`, `placeWebsite`, `latitude`, `longitude`\n- `menuUrl`, `menuCategories[]` — the menu page and the sections detected on it\n- `menuSource` — `menuPage` when the restaurant's own menu supplied the items, `google` when Google's inline menu did\n- `menuProvider` — the menu site or provider label, when identifiable\n- `menuSection` — the dish's section, e.g. `Antipasti` or `Desserts`\n- `itemName`, `itemDescription`\n- `priceText` — the price exactly as published, e.g. `$24.95`, `€12,50`, `12.00 USD`\n- `price` — numeric value when the price is unambiguous\n- `currency` — ISO code when the page states it or the symbol is unambiguous\n- `itemImage` — dish photo when the menu publishes one\n- `isPopular` — `true` only when Google's inline menu shows a Popular badge\n- `rank` — 1-based position in the collected menu\n- `totalItems` — rows returned for this restaurant\n- `menuFound: true`, `recordType: \"menuItem\"`, `sourceUrl`, `scrapedAt`\n\n## Output per place without a readable menu (`recordType: \"menuSummary\"`)\n\n- The same place context fields and `menuUrl` when one was found\n- `menuFound: false`, `menuSource: \"none\"`\n- `itemCount: 0`, `totalItems: 0`\n- `recordType: \"menuSummary\"`, `sourceUrl`, `scrapedAt`\n\nWhen `includePopularDishes` is enabled and Google exposes Popular badges, an additional summary row carries `popularDishes[]` beside the item rows.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `byPlace` | `byPlace` or `bySearch` |\n| `placeUrls` | array | – | Maps URLs, `maps.app.goo.gl` links, `ChIJ…` Place IDs or `0x…:0x…` feature IDs (mode=byPlace) |\n| `searchQueries` | array | – | Cuisine + city queries, e.g. `italian restaurant, New York` (mode=bySearch) |\n| `maxPlacesPerQuery` | integer | `20` | Restaurants to process per search query (1–120, mode=bySearch) |\n| `maxItemsPerPlace` | integer | `100` | Maximum menu rows per restaurant (1–1000) |\n| `language` | string | `en` | Language for Maps lookups and search results |\n| `includePlacesWithoutMenu` | boolean | `true` | Return a summary row for places with no readable menu |\n| `includePopularDishes` | boolean | `false` | Also check Google's inline menu for Popular badges (slower) |\n\n### Example: several restaurants by URL\n\n```json\n{\n  \"mode\": \"byPlace\",\n  \"placeUrls\": [\n    \"https://www.google.com/maps/place/Sicily+Osteria/@40.7601601,-73.9891863,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25932322b79d3:0x7c085aeae6751161!8m2!3d40.7601601!4d-73.9891863\",\n    \"https://www.google.com/maps/place/?q=place_id:ChIJxZXYx7cEdkgRdgAOZ6OHOJw\"\n  ],\n  \"maxItemsPerPlace\": 50\n}\n```\n\n### Example: search by cuisine and city\n\n```json\n{\n  \"mode\": \"bySearch\",\n  \"searchQueries\": [\"italian restaurant, New York\", \"sushi in Austin\"],\n  \"maxPlacesPerQuery\": 10,\n  \"maxItemsPerPlace\": 25,\n  \"includePlacesWithoutMenu\": true\n}\n```\n\n### Example: place IDs only\n\n```json\n{\n  \"mode\": \"byPlace\",\n  \"placeUrls\": [\"ChIJ03krMjJZwokRYRF15upaCHw\"],\n  \"maxItemsPerPlace\": 100,\n  \"language\": \"en\"\n}\n```\n\n### Example: non-English menu lookup\n\n```json\n{\n  \"mode\": \"byPlace\",\n  \"placeUrls\": [\"https://www.google.com/maps/place/?q=place_id:ChIJxZXYx7cEdkgRdgAOZ6OHOJw\"],\n  \"language\": \"de\",\n  \"maxItemsPerPlace\": 30\n}\n```\n\n## Use cases\n\n- **Menu intelligence** — track dish names, sections and prices across a city or chain\n- **Delivery and food-tech catalogues** — seed dish data with descriptions and price text\n- **Restaurant lead enrichment** — attach menu coverage, website and rating to a place list\n- **Market research** — compare cuisine pricing and menu depth across neighbourhoods\n- **Hospitality monitoring** — detect menu changes, new sections and removed dishes over time\n\n## FAQ\n\n**Where does the menu data come from?**\nFrom Google Maps place data plus the restaurant's own public menu page when it publishes one. The actor reads the menu items the restaurant publishes, not an AI guess.\n\n**Why is there no menu for some restaurants?**\nNot every restaurant publishes a structured menu. Coverage in tested cities is roughly 60–80%; places that publish only a PDF, an image, or a login-gated ordering page may not expose readable item rows. When `includePlacesWithoutMenu` is on, those places still produce one summary row so nothing is silently dropped.\n\n**Why do some items have no price or no description?**\nMany menus publish dish names without prices, or prices without descriptions. The actor reports what the page actually contains. `priceText` preserves the published price even when it cannot be interpreted as a single number, and `price`/`currency` are omitted when the value is ambiguous (for example a price range).\n\n**What is the difference between `menuSource` and `menuProvider`?**\n`menuSource` tells you whether the rows came from `menuPage` or Google's inline menu (`google`). `menuProvider` names the menu site or platform when it can be identified, which helps when you compare the same chain across locations.\n\n**What happens when `maxItemsPerPlace` is smaller than the published menu?**\nRows are returned in menu order up to the cap, and `totalItems` states how many rows this run returned for that place. Increase the cap to collect more.\n\n**Can I scrape many restaurants in one run?**\nYes. Use several `placeUrls` entries in `byPlace`, or one or more `searchQueries` in `bySearch`. Places are deduplicated by Place ID or feature ID before menus are fetched.\n\n**Do I need a proxy or a Google API key?**\nNo. The actor works without a key, login or proxy setup. It automatically chooses a working connection and only escalates when a source blocks the direct request.\n\n**How fresh is the data?**\nEach run reads the current public menu and place data; nothing is cached between runs. Menu changes appear on the next execution.\n\n**Is this affiliated with Google?**\nNo. This is an independent third-party actor that reads public Google Maps place data and public restaurant menu pages.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "google-maps-restaurant-menu-and-popular-dish",
      "title": "Google Maps Restaurant Menu & Price Scraper",
      "description": "Extract restaurant dishes, sections, descriptions, prices and place context from Google Maps and the restaurant's own menu page. Batch places or search by cuisine and city.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Google Maps Restaurant Menu & Price Scraper\n\nScrape restaurant menus from **Google Maps** and the restaurant's own public menu page. Paste one or many place URLs, or search by cuisine and city, and get one row per dish with its section, description, price, currency, photo, menu provenance, and the full place context — address, rating, review count, categories, website and coordinates. No login, API key or proxy setup is required.\n\n## What this actor does\n\n- **Two modes:** `byPlace` (Maps URL, short link, Place ID or feature ID) and `bySearch` (cuisine + city query)\n- **Batch-ready:** process many restaurants in one run, with a separate item cap per place\n- **Dish-level data:** menu section, item name, description, price text, numeric price and currency\n- **Menu provenance:** `menuSource`, `menuProvider`, the menu URL and the sections found for each restaurant\n- **Place context on every row:** address, rating, review count, price level, categories, website, latitude and longitude\n- **Honest no-menu rows:** when a place has no readable menu, one summary row records the place instead of inventing items\n- Empty or unavailable fields are omitted from each row rather than sent as `null`\n\n## Output per menu item (`recordType: \"menuItem\"`)\n\n- `businessName`, `placeId`, `featureId`, `placeUrl`\n- `placeAddress`, `placeRating`, `placeReviewCount`, `placePriceLevel`\n- `placeCategories[]`, `placeWebsite`, `latitude`, `longitude`\n- `menuUrl`, `menuCategories[]` — the menu page and the sections detected on it\n- `menuSource` — `menuPage` when the restaurant's own menu supplied the items, `google` when Google's inline menu did\n- `menuProvider` — the menu site or provider label, when identifiable\n- `menuSection` — the dish's section, e.g. `Antipasti` or `Desserts`\n- `itemName`, `itemDescription`\n- `priceText` — the price exactly as published, e.g. `$24.95`, `€12,50`, `12.00 USD`\n- `price` — numeric value when the price is unambiguous\n- `currency` — ISO code when the page states it or the symbol is unambiguous\n- `itemImage` — dish photo when the menu publishes one\n- `isPopular` — `true` only when Google's inline menu shows a Popular badge\n- `rank` — 1-based position in the collected menu\n- `totalItems` — rows returned for this restaurant\n- `menuFound: true`, `recordType: \"menuItem\"`, `sourceUrl`, `scrapedAt`\n\n## Output per place without a readable menu (`recordType: \"menuSummary\"`)\n\n- The same place context fields and `menuUrl` when one was found\n- `menuFound: false`, `menuSource: \"none\"`\n- `itemCount: 0`, `totalItems: 0`\n- `recordType: \"menuSummary\"`, `sourceUrl`, `scrapedAt`\n\nWhen `includePopularDishes` is enabled and Google exposes Popular badges, an additional summary row carries `popularDishes[]` beside the item rows.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `byPlace` | `byPlace` or `bySearch` |\n| `placeUrls` | array | – | Maps URLs, `maps.app.goo.gl` links, `ChIJ…` Place IDs or `0x…:0x…` feature IDs (mode=byPlace) |\n| `searchQueries` | array | – | Cuisine + city queries, e.g. `italian restaurant, New York` (mode=bySearch) |\n| `maxPlacesPerQuery` | integer | `20` | Restaurants to process per search query (1–120, mode=bySearch) |\n| `maxItemsPerPlace` | integer | `100` | Maximum menu rows per restaurant (1–1000) |\n| `language` | string | `en` | Language for Maps lookups and search results |\n| `includePlacesWithoutMenu` | boolean | `true` | Return a summary row for places with no readable menu |\n| `includePopularDishes` | boolean | `false` | Also check Google's inline menu for Popular badges (slower) |\n\n### Example: several restaurants by URL\n\n```json\n{\n  \"mode\": \"byPlace\",\n  \"placeUrls\": [\n    \"https://www.google.com/maps/place/Sicily+Osteria/@40.7601601,-73.9891863,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25932322b79d3:0x7c085aeae6751161!8m2!3d40.7601601!4d-73.9891863\",\n    \"https://www.google.com/maps/place/?q=place_id:ChIJxZXYx7cEdkgRdgAOZ6OHOJw\"\n  ],\n  \"maxItemsPerPlace\": 50\n}\n```\n\n### Example: search by cuisine and city\n\n```json\n{\n  \"mode\": \"bySearch\",\n  \"searchQueries\": [\"italian restaurant, New York\", \"sushi in Austin\"],\n  \"maxPlacesPerQuery\": 10,\n  \"maxItemsPerPlace\": 25,\n  \"includePlacesWithoutMenu\": true\n}\n```\n\n### Example: place IDs only\n\n```json\n{\n  \"mode\": \"byPlace\",\n  \"placeUrls\": [\"ChIJ03krMjJZwokRYRF15upaCHw\"],\n  \"maxItemsPerPlace\": 100,\n  \"language\": \"en\"\n}\n```\n\n### Example: non-English menu lookup\n\n```json\n{\n  \"mode\": \"byPlace\",\n  \"placeUrls\": [\"https://www.google.com/maps/place/?q=place_id:ChIJxZXYx7cEdkgRdgAOZ6OHOJw\"],\n  \"language\": \"de\",\n  \"maxItemsPerPlace\": 30\n}\n```\n\n## Use cases\n\n- **Menu intelligence** — track dish names, sections and prices across a city or chain\n- **Delivery and food-tech catalogues** — seed dish data with descriptions and price text\n- **Restaurant lead enrichment** — attach menu coverage, website and rating to a place list\n- **Market research** — compare cuisine pricing and menu depth across neighbourhoods\n- **Hospitality monitoring** — detect menu changes, new sections and removed dishes over time\n\n## FAQ\n\n**Where does the menu data come from?**\nFrom Google Maps place data plus the restaurant's own public menu page when it publishes one. The actor reads the menu items the restaurant publishes, not an AI guess.\n\n**Why is there no menu for some restaurants?**\nNot every restaurant publishes a structured menu. Coverage in tested cities is roughly 60–80%; places that publish only a PDF, an image, or a login-gated ordering page may not expose readable item rows. When `includePlacesWithoutMenu` is on, those places still produce one summary row so nothing is silently dropped.\n\n**Why do some items have no price or no description?**\nMany menus publish dish names without prices, or prices without descriptions. The actor reports what the page actually contains. `priceText` preserves the published price even when it cannot be interpreted as a single number, and `price`/`currency` are omitted when the value is ambiguous (for example a price range).\n\n**What is the difference between `menuSource` and `menuProvider`?**\n`menuSource` tells you whether the rows came from `menuPage` or Google's inline menu (`google`). `menuProvider` names the menu site or platform when it can be identified, which helps when you compare the same chain across locations.\n\n**What happens when `maxItemsPerPlace` is smaller than the published menu?**\nRows are returned in menu order up to the cap, and `totalItems` states how many rows this run returned for that place. Increase the cap to collect more.\n\n**Can I scrape many restaurants in one run?**\nYes. Use several `placeUrls` entries in `byPlace`, or one or more `searchQueries` in `bySearch`. Places are deduplicated by Place ID or feature ID before menus are fetched.\n\n**Do I need a proxy or a Google API key?**\nNo. The actor works without a key, login or proxy setup. It automatically chooses a working connection and only escalates when a source blocks the direct request.\n\n**How fresh is the data?**\nEach run reads the current public menu and place data; nothing is cached between runs. Menu changes appear on the next execution.\n\n**Is this affiliated with Google?**\nNo. This is an independent third-party actor that reads public Google Maps place data and public restaurant menu pages.\n",
      "minMemoryMbytes": 1024,
      "maxMemoryMbytes": 1024,
      "input": {
        "title": "Google Maps Restaurant Menu Scraper Input",
        "description": "Choose restaurant menus by Google Maps place URL/ID or search by cuisine and city, then collect dishes, sections, descriptions, prices and place context.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "How to choose restaurants: paste place URLs/IDs or run a Google Maps search query.",
            "editor": "select",
            "enum": [
              "byPlace",
              "bySearch"
            ],
            "enumTitles": [
              "Restaurants by URL or Place ID",
              "Restaurants by search query"
            ],
            "default": "byPlace",
            "prefill": "byPlace"
          },
          "placeUrls": {
            "title": "Place URLs or Place IDs",
            "type": "array",
            "description": "One restaurant per line (mode=byPlace). Accepts Google Maps place URLs, short maps.app.goo.gl links, canonical ChIJ Place IDs, and 0x…:0x… feature IDs.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": [
              "https://www.google.com/maps/place/Sicily+Osteria/@40.7601601,-73.9891863,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25932322b79d3:0x7c085aeae6751161!8m2!3d40.7601601!4d-73.9891863"
            ]
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Cuisine + city queries, e.g. `italian restaurant, New York` or `sushi in Austin` (mode=bySearch). Each query returns up to Max places per query.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "maxPlacesPerQuery": {
            "title": "Max places per query",
            "type": "integer",
            "description": "Maximum restaurants to process from each search query (mode=bySearch).",
            "minimum": 1,
            "maximum": 120,
            "default": 20,
            "prefill": 1
          },
          "maxItemsPerPlace": {
            "title": "Max items per place",
            "type": "integer",
            "description": "Maximum menu rows to return for each restaurant.",
            "minimum": 1,
            "maximum": 1000,
            "default": 100,
            "prefill": 3
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language used for Google Maps place lookups and search results.",
            "editor": "select",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "ja",
              "ko",
              "zh",
              "ar",
              "ru",
              "nl",
              "pl",
              "tr",
              "sv",
              "da",
              "no",
              "fi",
              "cs",
              "el",
              "he",
              "hi",
              "th",
              "vi",
              "id",
              "uk"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Italian",
              "Portuguese",
              "Japanese",
              "Korean",
              "Chinese",
              "Arabic",
              "Russian",
              "Dutch",
              "Polish",
              "Turkish",
              "Swedish",
              "Danish",
              "Norwegian",
              "Finnish",
              "Czech",
              "Greek",
              "Hebrew",
              "Hindi",
              "Thai",
              "Vietnamese",
              "Indonesian",
              "Ukrainian"
            ],
            "default": "en",
            "prefill": "en"
          },
          "includePlacesWithoutMenu": {
            "title": "Include places without a menu",
            "type": "boolean",
            "description": "Return one summary row for a restaurant whose menu cannot be read, so every input place is accounted for.",
            "default": true,
            "prefill": true
          },
          "includePopularDishes": {
            "title": "Include popular dishes",
            "type": "boolean",
            "description": "Also check Google's own inline menu when it is available and mark dishes Google labels Popular. This uses a browser and is slower.",
            "default": false,
            "prefill": false
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Google Maps Restaurant Menu & Price Scraper Output",
        "description": "Restaurant menu rows with dish name, section, description, price, currency, photo, menu provenance and full Google Maps place context.",
        "properties": {
          "menuItems": {
            "type": "string",
            "title": "Menu Items",
            "description": "Dataset containing menu item rows and one summary row per place without a readable menu.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Menu Items",
              "transformation": {
                "fields": [
                  "recordType",
                  "businessName",
                  "placeId",
                  "featureId",
                  "placeUrl",
                  "menuFound",
                  "menuSource",
                  "menuProvider",
                  "menuSurfaceRendered",
                  "itemCount",
                  "totalItems",
                  "itemName",
                  "menuSection",
                  "itemDescription",
                  "priceText",
                  "price",
                  "currency",
                  "isPopular",
                  "itemImage",
                  "rank",
                  "menuUrl",
                  "menuCategories",
                  "placeAddress",
                  "placeRating",
                  "placeReviewCount",
                  "placePriceLevel",
                  "placeCategories",
                  "placeWebsite",
                  "latitude",
                  "longitude",
                  "popularDishes",
                  "sourceUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Record Type",
                    "format": "text"
                  },
                  "businessName": {
                    "label": "Business",
                    "format": "text"
                  },
                  "placeId": {
                    "label": "Place ID",
                    "format": "text"
                  },
                  "featureId": {
                    "label": "Feature ID",
                    "format": "text"
                  },
                  "placeUrl": {
                    "label": "Google Maps URL",
                    "format": "link"
                  },
                  "menuFound": {
                    "label": "Menu Found",
                    "format": "boolean"
                  },
                  "menuSource": {
                    "label": "Menu Source",
                    "format": "text"
                  },
                  "menuProvider": {
                    "label": "Menu Provider",
                    "format": "text"
                  },
                  "menuSurfaceRendered": {
                    "label": "Google Menu Surface Rendered",
                    "format": "boolean"
                  },
                  "itemCount": {
                    "label": "Item Count",
                    "format": "number"
                  },
                  "totalItems": {
                    "label": "Total Items",
                    "format": "number"
                  },
                  "itemName": {
                    "label": "Item",
                    "format": "text"
                  },
                  "menuSection": {
                    "label": "Menu Section",
                    "format": "text"
                  },
                  "itemDescription": {
                    "label": "Description",
                    "format": "text"
                  },
                  "priceText": {
                    "label": "Price",
                    "format": "text"
                  },
                  "price": {
                    "label": "Price Value",
                    "format": "number"
                  },
                  "currency": {
                    "label": "Currency",
                    "format": "text"
                  },
                  "isPopular": {
                    "label": "Popular",
                    "format": "boolean"
                  },
                  "itemImage": {
                    "label": "Photo",
                    "format": "image"
                  },
                  "rank": {
                    "label": "Rank",
                    "format": "number"
                  },
                  "menuUrl": {
                    "label": "Menu URL",
                    "format": "link"
                  },
                  "menuCategories": {
                    "label": "Menu Sections",
                    "format": "array"
                  },
                  "placeAddress": {
                    "label": "Address",
                    "format": "text"
                  },
                  "placeRating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "placeReviewCount": {
                    "label": "Reviews",
                    "format": "number"
                  },
                  "placePriceLevel": {
                    "label": "Price Level",
                    "format": "text"
                  },
                  "placeCategories": {
                    "label": "Categories",
                    "format": "array"
                  },
                  "placeWebsite": {
                    "label": "Website",
                    "format": "link"
                  },
                  "latitude": {
                    "label": "Latitude",
                    "format": "number"
                  },
                  "longitude": {
                    "label": "Longitude",
                    "format": "number"
                  },
                  "popularDishes": {
                    "label": "Popular Dishes",
                    "format": "array"
                  },
                  "sourceUrl": {
                    "label": "Source URL",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "datetime"
                  }
                }
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "3ea3f34ee730f3b8875b32f5a02945a947c749ef99a3c4e7257f999d57b2dd92",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03972111111111111
    }
  }
}