{
  "data": {
    "id": "XEx3Cu06lzA2bQ9Zv",
    "actId": "2utsIhZID8OJ7SMVa",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-11T09:05:29.115Z",
    "finishedAt": "2026-11-11T09:05:33.791Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 4583,
      "runTimeSecs": 4.583,
      "computeUnits": 0.005092222222222222,
      "imageSizeBytes": 319133184
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Uber Eats Restaurant Search & Menu Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What to scrape\",\n      \"type\": \"string\",\n      \"description\": \"Search restaurants by keyword, scrape full menus from URLs/IDs, or search and pull the menu for every match.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"menus\",\n        \"searchWithMenus\"\n      ],\n      \"enumTitles\": [\n        \"Search restaurants (names, ratings, ETA)\",\n        \"Menus from restaurant URLs or IDs\",\n        \"Search restaurants + their menus\"\n      ],\n      \"prefill\": \"search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"Restaurant, cuisine, or dish keywords. Required for search and searchWithMenus modes. Each query is paginated automatically until maxRestaurants is reached.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"pizza\"\n      ],\n      \"sectionCaption\": \"Search\"\n    },\n    \"location\": {\n      \"title\": \"Delivery location\",\n      \"type\": \"string\",\n      \"description\": \"Address, city, postcode, or 'latitude,longitude' used to resolve Uber Eats delivery results. Uber Eats gates restaurant availability by location, so results differ by area.\",\n      \"default\": \"New York, NY\",\n      \"prefill\": \"New York, NY\",\n      \"editor\": \"textfield\"\n    },\n    \"country\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"description\": \"Fallback market when the delivery location cannot be resolved. Also sets the default city used for menu pricing context.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"us\",\n        \"gb\",\n        \"au\",\n        \"ca\",\n        \"in\",\n        \"ie\",\n        \"nz\",\n        \"fr\",\n        \"de\",\n        \"es\",\n        \"it\",\n        \"nl\",\n        \"jp\",\n        \"mx\",\n        \"za\"\n      ],\n      \"enumTitles\": [\n        \"United States\",\n        \"United Kingdom\",\n        \"Australia\",\n        \"Canada\",\n        \"India\",\n        \"Ireland\",\n        \"New Zealand\",\n        \"France\",\n        \"Germany\",\n        \"Spain\",\n        \"Italy\",\n        \"Netherlands\",\n        \"Japan\",\n        \"Mexico\",\n        \"South Africa\"\n      ],\n      \"default\": \"us\"\n    },\n    \"maxRestaurants\": {\n      \"title\": \"Max restaurants\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many unique restaurants across all search queries.\",\n      \"default\": 20,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"editor\": \"number\"\n    },\n    \"restaurantUrls\": {\n      \"title\": \"Restaurant URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Uber Eats restaurant page URLs or store IDs (for example https://www.ubereats.com/store/name/AbCdEf123 or a full UUID). Used by menus and searchWithMenus modes.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.ubereats.com/store/cvs-129-fulton-streets/isOmPe5EU261CcRN3X7RMw\"\n      ],\n      \"sectionCaption\": \"Menus\"\n    },\n    \"maxMenuItemsPerRestaurant\": {\n      \"title\": \"Max menu items per restaurant\",\n      \"type\": \"integer\",\n      \"description\": \"Cap on menu items returned for each restaurant. Pagination stops as soon as this cap is reached.\",\n      \"prefill\": 10,\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"editor\": \"number\"\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Uber Eats Restaurant Menu & Price Extractor\n\nTurn Uber Eats into a structured dataset. Search restaurants by keyword, then read their menus item by item, or feed in restaurant links and pull every section and price. Everything runs without cookies, logins, or API keys.\n\n## Three ways to scrape\n\n| Mode | Use it for | What you get |\n|---|---|---|\n| `search` | Discover restaurants for a keyword and delivery area | Restaurant name, URL, rating, review count, ETA, coordinates and rank |\n| `menus` | Export the full menu of restaurants you already know | Restaurant profile plus every menu section the public response exposes, with item price, currency, photo and availability |\n| `searchWithMenus` | Search, then export a menu for every match | Search fields, restaurant profile and complete menu in one record per restaurant |\n\n## Location matters\n\nUber Eats only serves restaurants that deliver to a specific address, so **results depend on `location`**. Pass a city, postcode, street address, or `latitude,longitude`. The actor resolves it to a real delivery point, then uses that context for both search and menu pricing. If the address cannot be resolved, it falls back to the default city for the selected `country`.\n\n## What is in each record\n\n- `mode`, `query`, `location`, `rank` — how the record was found\n- `restaurantId`, `restaurantName`, `restaurantUrl`, `heroImageUrl`\n- `rating`, `ratingCount`, `priceRange`, `cuisines`, `isOpen`\n- `address`, `city`, `postalCode`, `countryCode`, `latitude`, `longitude`\n- `phoneNumber`, `currencyCode`, `storeType`, `deliveryMethods`, `workingHours`\n- `deliveryFee`, `estimatedDeliveryTime`\n- `menu` — ordered sections, each with `sectionName` and `items`\n- `menuSectionCount`, `menuItemCount`, `itemsWithImageCount`, `itemsWithDescCount`\n- `scrapedAt`\n\nEach menu item contains:\n\n- `itemId`, `name`, `description`\n- `price` in major currency units (for example `12.50`), `currency`\n- `imageUrl`, `isAvailable`, `hasCustomizations`\n\nEmpty values are omitted, never returned as `null`.\n\n## Input examples\n\n### Search pizza places in Brooklyn\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"pizza\"],\n  \"location\": \"Brooklyn, NY\",\n  \"maxRestaurants\": 20\n}\n```\n\n### Export full menus for two restaurants\n\n```json\n{\n  \"mode\": \"menus\",\n  \"restaurantUrls\": [\n    \"https://www.ubereats.com/store/cvs-129-fulton-streets/isOmPe5EU261CcRN3X7RMw\",\n    \"https://www.ubereats.com/store/atlantis-cafe-1049-grand-street/p1lWs-ecV5ySgxZXi1PRcw\"\n  ],\n  \"location\": \"Brooklyn, NY\",\n  \"maxMenuItemsPerRestaurant\": 500\n}\n```\n\n### Search, then pull every menu\n\n```json\n{\n  \"mode\": \"searchWithMenus\",\n  \"searchQueries\": [\"sushi\", \"ramen\"],\n  \"location\": \"Toronto, ON\",\n  \"country\": \"ca\",\n  \"maxRestaurants\": 10,\n  \"maxMenuItemsPerRestaurant\": 150\n}\n```\n\n## How pagination works\n\nSearch results are requested page by page until `maxRestaurants` unique stores are collected or Uber Eats runs out of matches. Menus follow the same rule: the actor reads Uber Eats' own section paging and keeps requesting until the source stops returning items or `maxMenuItemsPerRestaurant` is reached. Menu item caps are applied across the whole restaurant, not per section.\n\n## Inputs\n\n| Field | Type | Default | Notes |\n|---|---|---|---|\n| `mode` | select | — | `search`, `menus`, or `searchWithMenus` (prefilled with `search`) |\n| `searchQueries` | array | — | Keywords for search modes (prefilled with `[\"pizza\"]`) |\n| `location` | string | `New York, NY` | Address, city, postcode, or `lat,lng` |\n| `country` | select | `us` | Fallback market and default city |\n| `maxRestaurants` | integer | `20` | 1–500 unique restaurants |\n| `restaurantUrls` | array | — | URLs or store IDs for menu modes |\n| `maxMenuItemsPerRestaurant` | integer | — | 1–2000 items per restaurant (prefilled with `10`) |\n\nExisting tasks that send `restaurantUrls` and `maxItemsPerRestaurant` keep working. The older key is read in code and mapped to `maxMenuItemsPerRestaurant`; it does not need to stay in the form.\n\n## Use cases\n\n- **Price monitoring** — snapshot competitor menus and track dish prices over time.\n- **Market research** — see which cuisines and restaurants serve a neighbourhood.\n- **Catalog enrichment** — add descriptions, photos, and availability to your own listings.\n- **Delivery benchmarking** — compare ratings, ETAs, and fees across an area.\n\n## FAQ\n\n**Does this need an Uber Eats account or cookies?**\nNo. The actor reads public restaurant and menu data and needs no login, cookie, or API key.\n\n**Do I need to configure a proxy?**\nNo. It works directly, and the actor chooses its network path automatically.\n\n**Why do two nearby addresses return different restaurants?**\nUber Eats filters by delivery radius. Change `location` to the exact area you care about.\n\n**Why is a menu shorter than what I see in the app?**\nSome stores hide items that are unavailable at the current time, lazy-load category sections, or do not expose them in the public menu response. The actor returns everything the public menu response exposes up to your item cap.\n\n**Are prices always in the same currency?**\nNo. `currencyCode` and each item's `currency` tell you the local currency, which depends on the delivery market.\n\n**Can I use restaurant IDs instead of full URLs?**\nYes. Paste either a full Uber Eats URL or a store UUID in `restaurantUrls`.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "uber-eats-restaurant-menu-and-price-extractor",
      "title": "Uber Eats Restaurant Menu & Price Extractor",
      "description": "Search Uber Eats restaurants by keyword or paste store links: ratings, cuisines, delivery ETA, full paginated menus, sections, items, and prices. Cookieless.",
      "version": "1.0",
      "buildTag": "latest",
      "input": {
        "title": "Uber Eats Restaurant Search & Menu Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What to scrape",
            "type": "string",
            "description": "Search restaurants by keyword, scrape full menus from URLs/IDs, or search and pull the menu for every match.",
            "editor": "select",
            "enum": [
              "search",
              "menus",
              "searchWithMenus"
            ],
            "enumTitles": [
              "Search restaurants (names, ratings, ETA)",
              "Menus from restaurant URLs or IDs",
              "Search restaurants + their menus"
            ],
            "prefill": "search"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Restaurant, cuisine, or dish keywords. Required for search and searchWithMenus modes. Each query is paginated automatically until maxRestaurants is reached.",
            "editor": "stringList",
            "prefill": [
              "pizza"
            ],
            "sectionCaption": "Search"
          },
          "location": {
            "title": "Delivery location",
            "type": "string",
            "description": "Address, city, postcode, or 'latitude,longitude' used to resolve Uber Eats delivery results. Uber Eats gates restaurant availability by location, so results differ by area.",
            "default": "New York, NY",
            "prefill": "New York, NY",
            "editor": "textfield"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Fallback market when the delivery location cannot be resolved. Also sets the default city used for menu pricing context.",
            "editor": "select",
            "enum": [
              "us",
              "gb",
              "au",
              "ca",
              "in",
              "ie",
              "nz",
              "fr",
              "de",
              "es",
              "it",
              "nl",
              "jp",
              "mx",
              "za"
            ],
            "enumTitles": [
              "United States",
              "United Kingdom",
              "Australia",
              "Canada",
              "India",
              "Ireland",
              "New Zealand",
              "France",
              "Germany",
              "Spain",
              "Italy",
              "Netherlands",
              "Japan",
              "Mexico",
              "South Africa"
            ],
            "default": "us"
          },
          "maxRestaurants": {
            "title": "Max restaurants",
            "type": "integer",
            "description": "Stop after this many unique restaurants across all search queries.",
            "default": 20,
            "prefill": 3,
            "minimum": 1,
            "maximum": 500,
            "editor": "number"
          },
          "restaurantUrls": {
            "title": "Restaurant URLs or IDs",
            "type": "array",
            "description": "Uber Eats restaurant page URLs or store IDs (for example https://www.ubereats.com/store/name/AbCdEf123 or a full UUID). Used by menus and searchWithMenus modes.",
            "editor": "stringList",
            "prefill": [
              "https://www.ubereats.com/store/cvs-129-fulton-streets/isOmPe5EU261CcRN3X7RMw"
            ],
            "sectionCaption": "Menus"
          },
          "maxMenuItemsPerRestaurant": {
            "title": "Max menu items per restaurant",
            "type": "integer",
            "description": "Cap on menu items returned for each restaurant. Pagination stops as soon as this cap is reached.",
            "prefill": 10,
            "minimum": 1,
            "maximum": 2000,
            "editor": "number"
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Uber Eats Restaurant Search & Menu Output",
        "description": "Uber Eats restaurant search results and full menus with item prices, sections, ratings, delivery details, and location context.",
        "properties": {
          "restaurants": {
            "type": "string",
            "title": "Uber Eats restaurants",
            "description": "Dataset of restaurant search results and menus",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Uber Eats Restaurant Menu & Price Extractor\n\nTurn Uber Eats into a structured dataset. Search restaurants by keyword, then read their menus item by item, or feed in restaurant links and pull every section and price. Everything runs without cookies, logins, or API keys.\n\n## Three ways to scrape\n\n| Mode | Use it for | What you get |\n|---|---|---|\n| `search` | Discover restaurants for a keyword and delivery area | Restaurant name, URL, rating, review count, ETA, coordinates and rank |\n| `menus` | Export the full menu of restaurants you already know | Restaurant profile plus every menu section the public response exposes, with item price, currency, photo and availability |\n| `searchWithMenus` | Search, then export a menu for every match | Search fields, restaurant profile and complete menu in one record per restaurant |\n\n## Location matters\n\nUber Eats only serves restaurants that deliver to a specific address, so **results depend on `location`**. Pass a city, postcode, street address, or `latitude,longitude`. The actor resolves it to a real delivery point, then uses that context for both search and menu pricing. If the address cannot be resolved, it falls back to the default city for the selected `country`.\n\n## What is in each record\n\n- `mode`, `query`, `location`, `rank` — how the record was found\n- `restaurantId`, `restaurantName`, `restaurantUrl`, `heroImageUrl`\n- `rating`, `ratingCount`, `priceRange`, `cuisines`, `isOpen`\n- `address`, `city`, `postalCode`, `countryCode`, `latitude`, `longitude`\n- `phoneNumber`, `currencyCode`, `storeType`, `deliveryMethods`, `workingHours`\n- `deliveryFee`, `estimatedDeliveryTime`\n- `menu` — ordered sections, each with `sectionName` and `items`\n- `menuSectionCount`, `menuItemCount`, `itemsWithImageCount`, `itemsWithDescCount`\n- `scrapedAt`\n\nEach menu item contains:\n\n- `itemId`, `name`, `description`\n- `price` in major currency units (for example `12.50`), `currency`\n- `imageUrl`, `isAvailable`, `hasCustomizations`\n\nEmpty values are omitted, never returned as `null`.\n\n## Input examples\n\n### Search pizza places in Brooklyn\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"pizza\"],\n  \"location\": \"Brooklyn, NY\",\n  \"maxRestaurants\": 20\n}\n```\n\n### Export full menus for two restaurants\n\n```json\n{\n  \"mode\": \"menus\",\n  \"restaurantUrls\": [\n    \"https://www.ubereats.com/store/cvs-129-fulton-streets/isOmPe5EU261CcRN3X7RMw\",\n    \"https://www.ubereats.com/store/atlantis-cafe-1049-grand-street/p1lWs-ecV5ySgxZXi1PRcw\"\n  ],\n  \"location\": \"Brooklyn, NY\",\n  \"maxMenuItemsPerRestaurant\": 500\n}\n```\n\n### Search, then pull every menu\n\n```json\n{\n  \"mode\": \"searchWithMenus\",\n  \"searchQueries\": [\"sushi\", \"ramen\"],\n  \"location\": \"Toronto, ON\",\n  \"country\": \"ca\",\n  \"maxRestaurants\": 10,\n  \"maxMenuItemsPerRestaurant\": 150\n}\n```\n\n## How pagination works\n\nSearch results are requested page by page until `maxRestaurants` unique stores are collected or Uber Eats runs out of matches. Menus follow the same rule: the actor reads Uber Eats' own section paging and keeps requesting until the source stops returning items or `maxMenuItemsPerRestaurant` is reached. Menu item caps are applied across the whole restaurant, not per section.\n\n## Inputs\n\n| Field | Type | Default | Notes |\n|---|---|---|---|\n| `mode` | select | — | `search`, `menus`, or `searchWithMenus` (prefilled with `search`) |\n| `searchQueries` | array | — | Keywords for search modes (prefilled with `[\"pizza\"]`) |\n| `location` | string | `New York, NY` | Address, city, postcode, or `lat,lng` |\n| `country` | select | `us` | Fallback market and default city |\n| `maxRestaurants` | integer | `20` | 1–500 unique restaurants |\n| `restaurantUrls` | array | — | URLs or store IDs for menu modes |\n| `maxMenuItemsPerRestaurant` | integer | — | 1–2000 items per restaurant (prefilled with `10`) |\n\nExisting tasks that send `restaurantUrls` and `maxItemsPerRestaurant` keep working. The older key is read in code and mapped to `maxMenuItemsPerRestaurant`; it does not need to stay in the form.\n\n## Use cases\n\n- **Price monitoring** — snapshot competitor menus and track dish prices over time.\n- **Market research** — see which cuisines and restaurants serve a neighbourhood.\n- **Catalog enrichment** — add descriptions, photos, and availability to your own listings.\n- **Delivery benchmarking** — compare ratings, ETAs, and fees across an area.\n\n## FAQ\n\n**Does this need an Uber Eats account or cookies?**\nNo. The actor reads public restaurant and menu data and needs no login, cookie, or API key.\n\n**Do I need to configure a proxy?**\nNo. It works directly, and the actor chooses its network path automatically.\n\n**Why do two nearby addresses return different restaurants?**\nUber Eats filters by delivery radius. Change `location` to the exact area you care about.\n\n**Why is a menu shorter than what I see in the app?**\nSome stores hide items that are unavailable at the current time, lazy-load category sections, or do not expose them in the public menu response. The actor returns everything the public menu response exposes up to your item cap.\n\n**Are prices always in the same currency?**\nNo. `currencyCode` and each item's `currency` tell you the local currency, which depends on the delivery market.\n\n**Can I use restaurant IDs instead of full URLs?**\nYes. Paste either a full Uber Eats URL or a store UUID in `restaurantUrls`.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Uber Eats Restaurants & Menus",
          "fields": {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "description": "search, menus, or searchWithMenus"
              },
              "query": {
                "type": "string",
                "nullable": true,
                "description": "Search keyword that produced this record"
              },
              "location": {
                "type": "string",
                "nullable": true,
                "description": "Resolved delivery location label"
              },
              "rank": {
                "type": "integer",
                "nullable": true,
                "description": "Position in the search result list"
              },
              "restaurantId": {
                "type": "string",
                "description": "Uber Eats store UUID"
              },
              "restaurantName": {
                "type": "string",
                "description": "Restaurant display name"
              },
              "restaurantUrl": {
                "type": "string",
                "description": "Canonical Uber Eats URL"
              },
              "heroImageUrl": {
                "type": "string",
                "nullable": true,
                "description": "Banner image URL"
              },
              "rating": {
                "type": "number",
                "nullable": true,
                "description": "Aggregate star rating"
              },
              "ratingCount": {
                "type": "string",
                "nullable": true,
                "description": "Total ratings (may include suffix like '15000+')"
              },
              "priceRange": {
                "type": "string",
                "nullable": true,
                "description": "Price tier when Uber Eats publishes one"
              },
              "cuisines": {
                "type": "array",
                "nullable": true,
                "description": "Cuisine category tags"
              },
              "isOpen": {
                "type": "boolean",
                "nullable": true,
                "description": "Currently open for delivery"
              },
              "address": {
                "type": "string",
                "nullable": true,
                "description": "Street address"
              },
              "city": {
                "type": "string",
                "nullable": true,
                "description": "City"
              },
              "postalCode": {
                "type": "string",
                "nullable": true,
                "description": "Postal code"
              },
              "countryCode": {
                "type": "string",
                "nullable": true,
                "description": "ISO country code"
              },
              "latitude": {
                "type": "number",
                "nullable": true,
                "description": "Restaurant latitude"
              },
              "longitude": {
                "type": "number",
                "nullable": true,
                "description": "Restaurant longitude"
              },
              "phoneNumber": {
                "type": "string",
                "nullable": true,
                "description": "Restaurant phone number when published"
              },
              "currencyCode": {
                "type": "string",
                "nullable": true,
                "description": "ISO currency code for menu prices"
              },
              "deliveryFee": {
                "type": "string",
                "nullable": true,
                "description": "Delivery fee as displayed"
              },
              "estimatedDeliveryTime": {
                "type": "string",
                "nullable": true,
                "description": "ETA as displayed"
              },
              "menu": {
                "type": "array",
                "description": "Nested menu sections with items"
              },
              "menuSectionCount": {
                "type": "integer",
                "nullable": true,
                "description": "Number of menu sections"
              },
              "menuItemCount": {
                "type": "integer",
                "nullable": true,
                "description": "Total menu items"
              },
              "itemsWithImageCount": {
                "type": "integer",
                "nullable": true,
                "description": "Items with an image"
              },
              "itemsWithDescCount": {
                "type": "integer",
                "nullable": true,
                "description": "Items with a description"
              },
              "scrapedAt": {
                "type": "string",
                "description": "UTC scrape timestamp"
              },
              "storeType": {
                "type": "string",
                "nullable": true,
                "description": "Uber Eats store type (for example PHYSICAL or GROCERY_STORE)"
              },
              "deliveryMethods": {
                "type": "array",
                "nullable": true,
                "description": "Available fulfillment methods such as DELIVERY or PICKUP"
              },
              "workingHours": {
                "type": "string",
                "nullable": true,
                "description": "Working-hours summary when published"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "mode",
                  "restaurantName",
                  "cuisines",
                  "rating",
                  "ratingCount",
                  "priceRange",
                  "isOpen",
                  "deliveryFee",
                  "estimatedDeliveryTime",
                  "menuSectionCount",
                  "menuItemCount",
                  "location",
                  "restaurantUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "mode": {
                    "label": "Mode",
                    "format": "text"
                  },
                  "restaurantName": {
                    "label": "Restaurant",
                    "format": "text"
                  },
                  "cuisines": {
                    "label": "Cuisines",
                    "format": "array"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "ratingCount": {
                    "label": "Reviews",
                    "format": "text"
                  },
                  "priceRange": {
                    "label": "Price",
                    "format": "text"
                  },
                  "isOpen": {
                    "label": "Open",
                    "format": "text"
                  },
                  "deliveryFee": {
                    "label": "Delivery Fee",
                    "format": "text"
                  },
                  "estimatedDeliveryTime": {
                    "label": "ETA",
                    "format": "text"
                  },
                  "menuSectionCount": {
                    "label": "Sections",
                    "format": "number"
                  },
                  "menuItemCount": {
                    "label": "Items",
                    "format": "number"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "restaurantUrl": {
                    "label": "URL",
                    "format": "link"
                  }
                }
              }
            },
            "menuItems": {
              "title": "Menu items",
              "transformation": {
                "fields": [
                  "restaurantName",
                  "menu"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "restaurantName": {
                    "label": "Restaurant",
                    "format": "text"
                  },
                  "menu": {
                    "label": "Menu",
                    "format": "array"
                  }
                }
              }
            },
            "analytics": {
              "title": "Analytics",
              "transformation": {
                "fields": [
                  "restaurantName",
                  "menuSectionCount",
                  "menuItemCount",
                  "itemsWithImageCount",
                  "itemsWithDescCount",
                  "rating",
                  "ratingCount",
                  "address",
                  "city",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "restaurantName": {
                    "label": "Restaurant",
                    "format": "text"
                  },
                  "menuSectionCount": {
                    "label": "Sections",
                    "format": "number"
                  },
                  "menuItemCount": {
                    "label": "Total Items",
                    "format": "number"
                  },
                  "itemsWithImageCount": {
                    "label": "Items w/ Image",
                    "format": "number"
                  },
                  "itemsWithDescCount": {
                    "label": "Items w/ Desc",
                    "format": "number"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "ratingCount": {
                    "label": "Reviews",
                    "format": "text"
                  },
                  "address": {
                    "label": "Address",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "d8d988467071b23db8995e3fa8a07f5c319ea59e5e82785da6ce43fffb5bff1b",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.005092222222222222
    }
  }
}