{
  "openapi": "3.0.1",
  "info": {
    "title": "Glovo Scraper",
    "description": "Glovo stores, restaurant menus and grocery aisles across 21 countries: product, price, section, store, rating, delivery fee, ETA and opening status. Shop aisles too, not only food. Prices compared between runs. Example: Spain, one city, 10 stores and 50 products each, about a minute.",
    "version": "1.0",
    "x-build-id": "g0g9RhaJgWmBYZ3KD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/badr_xba~glovo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-badr_xba-glovo-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/badr_xba~glovo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-badr_xba-glovo-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/badr_xba~glovo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-badr_xba-glovo-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": {
          "countries": {
            "title": "🌍 Countries",
            "type": "array",
            "description": "Glovo countries to browse (Morocco, Spain, Italy, Portugal, Poland, Romania, Kenya…). The Actor knows their main cities and the right language for each. Start with one country; add more once you have seen the shape of the data. Leave everything empty and the Actor runs a small demo on Casablanca.",
            "items": {
              "type": "string",
              "enum": [
                "am",
                "bg",
                "ci",
                "es",
                "ge",
                "hr",
                "it",
                "ke",
                "kg",
                "kz",
                "ma",
                "md",
                "me",
                "ng",
                "pl",
                "pt",
                "ro",
                "rs",
                "tn",
                "ua",
                "ug"
              ],
              "enumTitles": [
                "Armenia",
                "Bulgaria",
                "Côte d'Ivoire",
                "Spain",
                "Georgia",
                "Croatia",
                "Italy",
                "Kenya",
                "Kyrgyzstan",
                "Kazakhstan",
                "Morocco",
                "Moldova",
                "Montenegro",
                "Nigeria",
                "Poland",
                "Portugal",
                "Romania",
                "Serbia",
                "Tunisia",
                "Ukraine",
                "Uganda"
              ]
            }
          },
          "allCountries": {
            "title": "All Glovo countries",
            "type": "boolean",
            "description": "Browses the 21 countries where Glovo operates (233 cities). Very large: limit the cities per country AND pick the RESIDENTIAL proxy group, or Glovo will refuse the requests.",
            "default": false
          },
          "maxCitiesPerCountry": {
            "title": "Maximum cities per country",
            "minimum": 0,
            "type": "integer",
            "description": "How many cities to browse in each selected country (also applies to the Cities list). 0 = all of them.",
            "default": 1
          },
          "cities": {
            "title": "🏙️ Cities",
            "type": "array",
            "description": "City names or Glovo URL slugs: casablanca, Madrid, Las Palmas de Gran Canaria, Warsaw. Accents, capitals and spaces are fine, and \"madrid, sevilla\" in one line works too. A built-in city is sent to its own country automatically (casablanca → Morocco); other cities are tried in each selected country. When filled, these cities replace the built-in list.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste any Glovo link: a store (https://glovoapp.com/es/es/madrid/stores/goiko-madrid), a category (…/madrid/categories/comida_1), a city (https://glovoapp.com/fr/ma/casablanca/) or a whole country (https://glovoapp.com/it/it/). Links copied from the browser or app work as-is: tracking parameters, www., a missing https:// and several links in one line are cleaned up automatically. A city or country name (madrid, Morocco) also works. Unusable entries are listed in FAILED_INPUTS, never billed.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "useCountryCities": {
            "title": "Also browse the built-in cities",
            "type": "boolean",
            "description": "Browse the cities of the selected countries (the built-in list, or the Cities field when filled). Switch off to crawl only the Start URLs.",
            "default": true
          },
          "languageCode": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter language code for the Glovo interface (fr, en, es, it…). Empty uses the language of each country."
          },
          "scrapeMenus": {
            "title": "Get menus and products",
            "type": "boolean",
            "description": "Off, you get a fast store-only list for the whole city: rating, fees, ETA and opening status.",
            "default": true
          },
          "scrapeShopAisles": {
            "title": "Explore shop and supermarket aisles",
            "type": "boolean",
            "description": "Walks the aisles of groceries and shops, not only restaurant menus.",
            "default": true
          },
          "maxAisleDepth": {
            "title": "Aisle depth",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How deep to follow sub-aisles inside a supermarket or shop. 2 covers most catalogues; raise it for very large grocery stores.",
            "default": 2
          },
          "maxStoresPerCity": {
            "title": "Maximum stores per city",
            "minimum": 0,
            "type": "integer",
            "description": "How many stores to read in each city. 5 to 10 finishes in about a minute; raise it once you know the run does what you want. 0 = every store of the city.",
            "default": 10
          },
          "maxProductsPerStore": {
            "title": "Maximum products per store",
            "minimum": 0,
            "type": "integer",
            "description": "How many items to read in each store menu (default 50). The demo uses 10 to keep the first run at a few cents; raise it for a full export. 0 = the whole menu.",
            "default": 50
          },
          "maxItems": {
            "title": "Maximum results (whole run)",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on the number of rows saved (and billed) for the whole run. The run stops exactly at this number. 0 = no cap, only the per-city and per-store limits apply.",
            "default": 0
          },
          "includeClosedStores": {
            "title": "Include closed stores",
            "type": "boolean",
            "description": "Keeps stores currently closed, flagged isOpen: false, so your catalogue stays complete.",
            "default": true
          },
          "storeNameContains": {
            "title": "Store name contains",
            "type": "string",
            "description": "Keep only stores whose name contains this text, to follow one brand."
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only products at this price or above, in the site currency."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only products at this price or below."
          },
          "onlyPromotions": {
            "title": "Only products on promotion",
            "type": "boolean",
            "description": "Keep only products with a running promotion (-30%, 2x1…). Great for a daily deals feed.",
            "default": false
          },
          "minDiscountPercent": {
            "title": "Minimum discount (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only products with a percentage discount of at least this size (e.g. 20 keeps -20%, -30%, -50%…). 2x1-type offers have no percentage and are left out."
          },
          "nameKeywords": {
            "title": "Name contains",
            "type": "array",
            "description": "Keep only products whose name contains one of these words.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Name excludes",
            "type": "array",
            "description": "Exclude products whose name contains one of these words.",
            "items": {
              "type": "string"
            }
          },
          "categoryKeywords": {
            "title": "Menu section or store type contains",
            "type": "array",
            "description": "Keep only items whose menu section or store type contains one of these words.",
            "items": {
              "type": "string"
            }
          },
          "trackPriceChanges": {
            "title": "Track prices between runs",
            "type": "boolean",
            "description": "Remembers each price to report the previous price, the change and its percentage on the next run.",
            "default": false
          },
          "onlyChangedProducts": {
            "title": "Only changed products",
            "type": "boolean",
            "description": "Saves only products whose price or stock moved since the last run. Ideal for a daily watch: you pay for the changes, not the catalogue.",
            "default": false
          },
          "sendEmailAlerts": {
            "title": "Send e-mail alerts",
            "type": "boolean",
            "description": "Sends price drops and back-in-stock products to your Apify account e-mail. Requires full permissions — see the FAQ.",
            "default": false
          },
          "alertMinPriceDropPercent": {
            "title": "Minimum drop to alert (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Only price drops of at least this size trigger an alert.",
            "default": 10
          },
          "maxRequestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 150,
            "type": "integer",
            "description": "Crawling speed. Glovo publishes no limit; 90 keeps runs quick and stable. Lower it if you want to be gentler.",
            "default": 90
          },
          "botContact": {
            "title": "Bot contact",
            "type": "string",
            "description": "A URL or e-mail put in the User-Agent so the site can identify the crawler. Left empty, the Actor's own page is used."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Glovo allows crawling, so no proxy is needed to start (cheapest option). Switch Apify Proxy on if Glovo begins answering 403, and pick the RESIDENTIAL group when browsing many cities or countries at once. With a proxy, a blocked request is retried from a new IP address.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}