{
  "openapi": "3.0.1",
  "info": {
    "title": "Talabat Scraper: Restaurant Menus, Prices, Reviews",
    "description": "Talabat scraper for UAE, Kuwait, Qatar, Bahrain, Oman, Jordan and Egypt, no login: restaurants by area, city, search or chain. Each row nests the full menu with dish prices and old prices, plus rating and, from area lists, delivery fee and minimum order. Options and reviews on request.",
    "version": "0.1",
    "x-build-id": "cw1bJOeBve5Nhl36K"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/automation_craft~talabat-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-automation_craft-talabat-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/automation_craft~talabat-scraper/runs": {
      "post": {
        "operationId": "runs-sync-automation_craft-talabat-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/automation_craft~talabat-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-automation_craft-talabat-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",
        "properties": {
          "startUrls": {
            "title": "Talabat links",
            "type": "array",
            "description": "Links copied from talabat.com: an area list (https://www.talabat.com/uae/restaurants/1169/abu-hail, its filter, sort and cuisine are kept unless you set your own below), a restaurant menu (https://www.talabat.com/uae/restaurant/38382/bucket-restaurant-nadd-al-hamar?aid=1169) or a brand page (https://www.talabat.com/uae/mcdonalds, every branch of the chain in that market). Arabic links (/ar/...) read the Arabic menu. You can also link a remote text file with one Talabat link per line.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "countries": {
            "title": "Markets",
            "type": "array",
            "description": "The Talabat markets your areas, cities, search words, chains and branch ids belong to: uae, kuwait, qatar, bahrain, oman, jordan, egypt (the ISO codes ae, kw, qa, bh, om, jo, eg work too). Several markets in one run are fine. Saudi Arabia and Iraq are not served on talabat.com and are refused with a free row.",
            "items": {
              "type": "string",
              "enumSuggestedValues": [
                "uae",
                "kuwait",
                "qatar",
                "bahrain",
                "oman",
                "jordan",
                "egypt"
              ],
              "enumTitles": [
                "United Arab Emirates",
                "Kuwait",
                "Qatar",
                "Bahrain",
                "Oman",
                "Jordan",
                "Egypt"
              ]
            }
          },
          "areas": {
            "title": "Areas",
            "type": "array",
            "description": "Delivery areas, each read as its full restaurant list (15 a page, A to Z by default): an area number with its market (uae/1169), an area link, or an area name as Talabat writes it (Abu Hail) within the markets above. A name shared by several areas is not guessed: a free row lists them.",
            "items": {
              "type": "string"
            }
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "Whole cities (Dubai, Kuwait City, Cairo), read area by area from the centre out with every restaurant delivered once. Delivery zones overlap, so later areas add fewer new restaurants; use the limits below to bound the run. Write uae/Dubai when a city name exists in several markets.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Delivery points",
            "type": "array",
            "description": "Points as latitude,longitude (25.2048,55.2708). Each point is read as the restaurant list of the area Talabat delivers it from; with search words below, the searches run around these points instead. A point Talabat does not deliver to gets a free row.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search words",
            "type": "array",
            "description": "Words to search on Talabat (pizza, shawarma, a restaurant name), around the delivery points above, or around the centre of every city of the markets above. Talabat answers any word, even one nothing matches, with unrelated restaurants, so a result is delivered only when it matches (see Search match).",
            "items": {
              "type": "string"
            }
          },
          "chains": {
            "title": "Chains (brand slugs)",
            "type": "array",
            "description": "Every branch of a chain in a market, by the brand's slug as it appears in its Talabat link (talabat.com/uae/mcdonalds is mcdonalds), or by the brand link itself. A slug can differ between markets (McDonald's Bahrain is mcdonalds--adliya); write uae/mcdonalds to name the market. Talabat's brand list is checked from a second point; when it gives one branch or none, or another list there, the branches are collected around every city centre (the coverage row says so).",
            "items": {
              "type": "string"
            }
          },
          "branchIds": {
            "title": "Branch ids",
            "type": "array",
            "description": "Single restaurant branches by Talabat's branch id, the number in a menu link (talabat.com/uae/restaurant/38382/...): 38382 with one market above, or uae/38382.",
            "items": {
              "type": "string"
            }
          },
          "wholeCountry": {
            "title": "Every brand of the markets",
            "type": "boolean",
            "description": "Read every brand of each market above from Talabat's public sitemap (UAE about 30,600 brand pages), every branch of each brand. Large: bound it with Max restaurants.",
            "default": false
          },
          "listAreasOnly": {
            "title": "List the cities and areas only",
            "type": "boolean",
            "description": "Read nothing but the markets' cities and areas (one free row per market with every area id, name, slug and coordinates), and for each area you name its cuisines, filters and sorts. Use it to find the areas to read. No restaurant is delivered.",
            "default": false
          },
          "includeMenu": {
            "title": "Full menu",
            "type": "boolean",
            "description": "Nest the whole menu in each restaurant row: every dish with its price, old price, discount, description, photo, sections and flags, repeats removed. Off: list facts only (an area list row needs no extra request then).",
            "default": true
          },
          "includeOptions": {
            "title": "Dish options (charged per dish)",
            "type": "boolean",
            "description": "Read the option tree of every dish that has options: sizes, add-ons and extras with prices, minimum and maximum choices, required sections and nested options. Gives the real starting price of dishes the menu lists at 0. Charged as one Dish option set per dish read.",
            "default": false
          },
          "maxOptionDishesPerRestaurant": {
            "title": "Max dishes with options read per restaurant",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most option trees read per restaurant (the first dishes with options in menu order). Empty: up to 1,000."
          },
          "includeReviews": {
            "title": "Customer reviews (charged per review)",
            "type": "boolean",
            "description": "Deliver each restaurant's customer reviews as rows, newest first: date, the reviewer's name from Talabat's first name field (sometimes a full name; its placeholder First Name is left empty), stars and text. Charged as one Review per review delivered.",
            "default": false
          },
          "maxReviewsPerRestaurant": {
            "title": "Max reviews per restaurant",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "The most reviews delivered per restaurant (newest first). Empty: 100. Up to 5,000."
          },
          "reviewsSince": {
            "title": "Reviews since",
            "type": "string",
            "description": "Only reviews dated on or after this day (YYYY-MM-DD)."
          },
          "includeReviewStats": {
            "title": "Exact review figures",
            "type": "boolean",
            "description": "Count every review of the restaurant (Talabat shows rating counts in buckets such as 1000+): the exact number of reviews, their average stars, how many have text, the newest and oldest dates. Included in the Restaurant event.",
            "default": false
          },
          "includeChainInfo": {
            "title": "Chain figures",
            "type": "boolean",
            "description": "Add the chain's own rating and its exact rating count across all its branches in the market. Included in the Restaurant event.",
            "default": false
          },
          "includeSearchFlags": {
            "title": "Offer and label flags",
            "type": "boolean",
            "description": "For restaurants not found by a search, look each one up in Talabat's search once to add its offer text (30% off select items), rating label (Very good), price tag, Talabat Pro flag and pickup time. Included in the Restaurant event.",
            "default": false
          },
          "language": {
            "title": "Menu language",
            "enum": [
              "en",
              "ar",
              "en_ar"
            ],
            "type": "string",
            "description": "English, Arabic, or both (the Arabic dish, description and section names added next to the English ones). Left empty: the language of a pasted link (an /ar/ link reads Arabic), else English. A cuisine filter needs English names: with Arabic only it is refused, use English and Arabic."
          },
          "dishRows": {
            "title": "One row per dish (charged per dish row)",
            "type": "boolean",
            "description": "Also deliver every dish as its own dataset row, for spreadsheets. Charged as one Dish row per dish. The dishes stay nested in the restaurant row either way.",
            "default": false
          },
          "maxDishesPerRestaurant": {
            "title": "Max dishes per restaurant",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Keep only the first dishes of each menu (menu order). Empty: the whole menu."
          },
          "includeNonRestaurants": {
            "title": "Include shops (groceries, pharmacies, flowers)",
            "type": "boolean",
            "description": "Area lists also carry grocery, pharmacy and flower shops. Off: they are left out free. On: they are delivered with their list facts (a flower shop with its catalogue as the menu).",
            "default": false
          },
          "omitEmptyFields": {
            "title": "Leave out empty fields",
            "type": "boolean",
            "description": "Drop fields that are empty (null, empty text, empty lists) from restaurant, review and dish rows.",
            "default": false
          },
          "transformFunction": {
            "title": "Transform function",
            "type": "string",
            "description": "Optional JavaScript function that receives each restaurant, review or dish row and returns the object to store, for example (row) => ({ name: row.name, rating: row.rating }). It runs with a 100 ms limit per row; the row type, branch id, market, position and dish id are kept; a failure stores the row unchanged."
          },
          "cuisines": {
            "title": "Cuisines",
            "type": "array",
            "description": "Keep only restaurants of these cuisines, by Talabat's cuisine slug (burgers, pizza, fish-chips). Applied by Talabat on area lists and checked on every row.",
            "items": {
              "type": "string"
            }
          },
          "listFilters": {
            "title": "Talabat list filters",
            "type": "array",
            "description": "Talabat's own list filters: top_rated (4.0 and above), free_delivery, fast_delivery (within 30 minutes), newly_added, offers, pickup, veg_only, exceptional. Several are combined (all must hold).",
            "items": {
              "type": "string",
              "enumSuggestedValues": [
                "top_rated",
                "free_delivery",
                "fast_delivery",
                "newly_added",
                "offers",
                "pickup",
                "veg_only",
                "exceptional"
              ],
              "enumTitles": [
                "Rating 4.0 and above",
                "Free delivery",
                "Within 30 minutes",
                "Newly added",
                "Offers",
                "Pickup",
                "Vegetarian only",
                "Exceptional"
              ]
            }
          },
          "sortBy": {
            "title": "Area list order",
            "enum": [
              "a_z",
              "rating",
              "fastest_delivery",
              "delivery_fee",
              "minimum_order"
            ],
            "type": "string",
            "description": "The order an area list is read in. A to Z is the only order that stays the same between two reads, so a capped read always gets the same restaurants. Left empty: a pasted area link's own order, else A to Z."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only restaurants rated at least this (0 to 5)."
          },
          "onlyOpen": {
            "title": "Only open now",
            "type": "boolean",
            "description": "Keep only restaurants open at read time (known from area lists; a restaurant found another way does not pass).",
            "default": false
          },
          "onlyTalabatPro": {
            "title": "Only Talabat Pro restaurants",
            "type": "boolean",
            "description": "Keep only restaurants marked for Talabat Pro (known from area lists and searches).",
            "default": false
          },
          "chainFilter": {
            "title": "Chain filter",
            "type": "array",
            "description": "Keep only these chains in area lists (areas, cities, delivery points, area links, markets alone): brand slugs as in the brand's Talabat link (kfc, mango-talaat-juffair). Each is resolved at the area's centre and a restaurant is kept by its branch id. The area's first list page is read, then the brand's branches that Talabat's search shows around the area's centre (they serve that point, and can include a branch the area list itself does not show; search rows carry no delivery fee or minimum order). Not combined with Only open now or list filters.",
            "items": {
              "type": "string"
            }
          },
          "searchMatch": {
            "title": "Search match",
            "enum": [
              "any",
              "name",
              "exact_name"
            ],
            "type": "string",
            "description": "Which search results are delivered: any (the words are in the name, a cuisine, or Talabat matched a dish), name (in the name only), or exact_name (the restaurant's name, without the branch part Talabat adds after a comma, equals the words; for checking a list of restaurant names; no match gives a free row).",
            "default": "any"
          },
          "maxRestaurants": {
            "title": "Max restaurants",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "The most restaurants delivered (or checked by a monitor) in the run. Empty: 200."
          },
          "maxRestaurantsPerSubject": {
            "title": "Max restaurants per entry",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "The most restaurants delivered for each area, city, point, search or chain. Empty: no limit per entry."
          },
          "maxPagesPerArea": {
            "title": "Max list pages per area",
            "minimum": 1,
            "maximum": 400,
            "type": "integer",
            "description": "The most list pages (15 restaurants each) read per area. Empty: every page."
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name a monitor to remember what was delivered across scheduled runs (a memory this Actor keeps for this name). Changes mode: delivers new restaurants and those whose dishes, prices, rating, fee, minimum order or Talabat Pro flag changed (with the previous values), or that have new reviews when reviews are on, and one short Menu check row for each unchanged one. New only mode: delivers restaurants never delivered before and skips known ones without reading them."
          },
          "monitorMode": {
            "title": "Monitor mode",
            "enum": [
              "changes",
              "new_only"
            ],
            "type": "string",
            "description": "changes (default) or new_only. Needs a monitor name."
          },
          "resetMonitor": {
            "title": "Reset the monitor",
            "type": "boolean",
            "description": "Forget what the named monitor remembered and start again.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Parallel reads",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "Restaurants read at the same time (1 to 3). The pace stays near one request a second each."
          },
          "proxyConfiguration": {
            "title": "Proxy (second door)",
            "type": "object",
            "description": "Requests leave from the run's own address. If Talabat refuses it, the run moves to one Apify datacenter proxy session (default), or to your own proxies. Turn the Apify proxy off with no links to never use a proxy. Residential groups are read as the datacenter pool. Your own proxy link needs a password of 8 or more characters with letters and digits, and no other setting may repeat part of its user name or password (the run is refused, so they can never reach a row)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}