{
  "openapi": "3.0.1",
  "info": {
    "title": "Bolt Food Restaurant & Menu Scraper",
    "description": "Scrape Bolt Food restaurants, stores and full menus with prices across 260 cities in 16 countries. Search by keyword, list every venue delivering to an address, or pull full menus from venue URLs. Every menu row carries its venue, city and rating. Clean JSON, no browser.",
    "version": "0.0",
    "x-build-id": "xf7jkekZeJiekNidS"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/teodor_banea~bolt-food-restaurant-menu-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-teodor_banea-bolt-food-restaurant-menu-scraper",
        "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/teodor_banea~bolt-food-restaurant-menu-scraper/runs": {
      "post": {
        "operationId": "runs-sync-teodor_banea-bolt-food-restaurant-menu-scraper",
        "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/teodor_banea~bolt-food-restaurant-menu-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-teodor_banea-bolt-food-restaurant-menu-scraper",
        "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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "searchMenus",
              "discoveryMenus",
              "venueUrls",
              "search",
              "discovery"
            ],
            "type": "string",
            "description": "The first three modes crawl all the way to the menus and return one row per menu item, each row carrying the venue it came from. The last two stop at the venue list. Whichever rows a mode produces are the ones you are charged for.",
            "default": "searchMenus"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Enter one or more search terms (e.g. \"pizza\", \"sushi\", \"burger\"). Bolt Food searches the whole city and returns every match at once, so a handful of queries covers a lot of ground. Only used in \"Search venues by keyword\" mode.",
            "items": {
              "type": "string"
            }
          },
          "venueUrls": {
            "title": "Venue URLs",
            "type": "array",
            "description": "Enter Bolt Food venue page URLs. The full menu with prices is extracted for each one. Only used in \"Venue URLs → full menus\" mode.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Enter the Bolt Food city to scrape (e.g. \"Bucharest\", \"Tallinn\", \"Prague\"). All 260 Bolt Food cities across 16 countries are recognized by name, ignoring case and accents. If the name is not a Bolt Food city, the run stops and suggests the closest matches."
          },
          "address": {
            "title": "Delivery address",
            "type": "string",
            "description": "Optional street address inside the city, e.g. \"Piata Victoriei\". Bolt Food results depend on where you order to, so this narrows the venue list to what actually delivers to that spot. Requires City."
          },
          "latitude": {
            "title": "Latitude",
            "pattern": "^-?\\d{1,2}(\\.\\d+)?$",
            "type": "string",
            "description": "Advanced: exact latitude to deliver to. Set together with Longitude, this overrides City and Delivery address. Bolt Food results are per-address, so a precise point gives you exactly the venues that deliver there."
          },
          "longitude": {
            "title": "Longitude",
            "pattern": "^-?\\d{1,3}(\\.\\d+)?$",
            "type": "string",
            "description": "Advanced: exact longitude to deliver to. Set together with Latitude, this overrides City and Delivery address."
          },
          "expandCatalogs": {
            "title": "Expand large store catalogs",
            "type": "boolean",
            "description": "Supermarkets and other grid-layout stores hold thousands of products behind category pages, and Bolt only returns one sample product per category up front. Turn this on to walk into those categories (up to 60 extra requests per store). Restaurants never need it, and it can multiply your result count — consider setting \"Maximum results\" alongside it.",
            "default": false
          },
          "language": {
            "title": "Menu language",
            "type": "string",
            "description": "Language code for venue and menu texts, e.g. \"en-US\", \"ro\", \"pl\", \"et\". Bolt falls back to the venue's own language when a translation is missing.",
            "default": "en-US"
          },
          "maxMenuItemsPerVenue": {
            "title": "Maximum menu items per venue",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Optional cap on menu items per venue. Leave at 0 to get every venue's full menu.",
            "default": 0
          },
          "maxVenues": {
            "title": "Maximum venues",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Optional cap on how many venues are scraped (and how many menus are fetched when menus are on). Leave at 0 to take every venue that delivers to the location — a large city feed holds 300–600.",
            "default": 0
          },
          "maxItemsTotal": {
            "title": "Maximum results",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Optional hard ceiling on billed results (venues, or menu items when menus are on). Leave at 0 for no limit. This is the single most reliable way to bound what a run can cost.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many requests run in parallel. The default suits every mode; there is rarely a reason to change it.",
            "default": 10
          },
          "maxRequestsPerMinute": {
            "title": "Maximum requests per minute",
            "minimum": 10,
            "maximum": 1200,
            "type": "integer",
            "description": "Throttle the overall request rate. Raise it for very large runs, or lower it to be gentler on the target.",
            "default": 300
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}