{
  "openapi": "3.0.1",
  "info": {
    "title": "Restaurant Menu Scraper: Websites, Uber Eats, Skip, DoorDash",
    "description": "Extract restaurant menus (sections, dishes, prices, photos) from restaurant websites, PDF menus, Clover, Uber Eats, SkipTheDishes and DoorDash, plus ordering, POS and reservation stack, socials, emails, phones, logo and brand colours. Optional dish-by-dish delivery-app price comparison.",
    "version": "0.1",
    "x-build-id": "r8Ke9CamDsfwoxP72"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yugenox~restaurant-menu-extractor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yugenox-restaurant-menu-extractor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/yugenox~restaurant-menu-extractor/runs": {
      "post": {
        "operationId": "runs-sync-yugenox-restaurant-menu-extractor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/yugenox~restaurant-menu-extractor/run-sync": {
      "post": {
        "operationId": "run-sync-yugenox-restaurant-menu-extractor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "startUrls": {
            "title": "🍽️ Restaurant websites or ordering links",
            "type": "array",
            "description": "Restaurant websites as full links (https://paitoronto.com). Several links pasted into one line are split automatically, and a remote text file with one website per line works too. You can also paste ordering links directly: Clover (clover.com/online-ordering/…), Uber Eats (ubereats.com/…/store/…), SkipTheDishes (skipthedishes.com/…) or DoorDash (doordash.com/store/…).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "datasetId": {
            "title": "🗺️ Google Maps results (dataset ID)",
            "type": "string",
            "description": "Optional. The ID of a dataset produced by a Google Maps scraper. Every place that has a website is processed; its place ID and coordinates are carried over."
          },
          "maxRestaurants": {
            "title": "🔢 Max restaurants",
            "minimum": 1,
            "type": "integer",
            "description": "Upper limit on how many restaurants are processed (after removing duplicate websites).",
            "default": 100
          },
          "outputMode": {
            "title": "📦 Output format",
            "enum": [
              "restaurant",
              "items"
            ],
            "type": "string",
            "description": "One row per restaurant (with the menu nested inside) or one row per menu item (flat, spreadsheet-friendly).",
            "default": "restaurant"
          },
          "followDeliveryPlatforms": {
            "title": "🛵 Delivery-app menus",
            "enum": [
              "fallback",
              "always",
              "never"
            ],
            "type": "string",
            "description": "Fallback: use Uber Eats / SkipTheDishes / DoorDash only when the website has no readable menu. Always: also fetch every linked delivery app and compare prices dish by dish (adds additionalMenus + channelPrices). Never: website only.",
            "default": "fallback"
          },
          "extractMenu": {
            "title": "📋 Extract menus",
            "type": "boolean",
            "description": "Turn off to collect only links, contacts, ordering/reservation stack and brand info (faster, cheaper).",
            "default": true
          },
          "menuSources": {
            "title": "Menu sources (in priority order)",
            "type": "array",
            "description": "Which sources may be used, tried in this order. Structured data on the website is exact and free; AI reading handles plain-text and PDF menus.",
            "items": {
              "type": "string",
              "enum": [
                "json-ld",
                "clover",
                "website-llm",
                "pdf-llm",
                "ubereats",
                "skip",
                "doordash"
              ],
              "enumTitles": [
                "Website structured data",
                "Clover online ordering",
                "Website menu text (AI)",
                "PDF menus (AI)",
                "Uber Eats",
                "SkipTheDishes",
                "DoorDash"
              ]
            },
            "default": [
              "json-ld",
              "clover",
              "website-llm",
              "pdf-llm",
              "ubereats",
              "skip",
              "doordash"
            ]
          },
          "ocrMenuImages": {
            "title": "📷 Read menu photos",
            "type": "boolean",
            "description": "When a restaurant's menu exists only as images, read them with AI vision. Billed per image that turns out to be a menu.",
            "default": false
          },
          "maxMenuPages": {
            "title": "Menu pages per site",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many menu pages to open per website (lunch, dinner, drinks, other locations…).",
            "default": 3
          },
          "maxPdfs": {
            "title": "PDF menus per site",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "How many linked PDF menus to read per website.",
            "default": 2
          },
          "includeBrandKit": {
            "title": "🎨 Brand kit (fonts & colours)",
            "type": "boolean",
            "description": "Add the website's main fonts and brand colours.",
            "default": true
          },
          "includePageText": {
            "title": "📝 Page text",
            "type": "boolean",
            "description": "Add the visible text of the home and menu pages (up to 60,000 characters) — useful for your own AI processing.",
            "default": false
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after saving this many rows (restaurants, or menu items in item mode). Leave empty for no limit."
          },
          "maxConcurrency": {
            "title": "Parallel restaurants",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many restaurants are processed at the same time.",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Datacenter proxy is used by default; sites that block it are retried automatically on residential IPs.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}