{
  "openapi": "3.0.1",
  "info": {
    "title": "Glovo Scraper – Stores, Restaurants & Menus",
    "description": "Scrape Glovo stores and restaurants with their full menus: dish and product names, prices, options, photos, categories, ratings, delivery fees and opening status. Works in every Glovo country and city.",
    "version": "1.0",
    "x-build-id": "utjBf9Byjh47haVvx"
  },
  "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": "Pays",
            "type": "array",
            "description": "Pays Glovo à parcourir. Les villes principales de chaque pays sont utilisées automatiquement.",
            "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": [
                "Arménie (3 villes)",
                "Bulgarie (24 villes)",
                "Côte d'Ivoire (5 villes)",
                "Espagne (16 villes)",
                "Géorgie (10 villes)",
                "Croatie (17 villes)",
                "Italie (15 villes)",
                "Kenya (8 villes)",
                "Kirghizistan (4 villes)",
                "Kazakhstan (14 villes)",
                "Maroc (24 villes)",
                "Moldavie (2 villes)",
                "Monténégro (7 villes)",
                "Nigeria (8 villes)",
                "Pologne (16 villes)",
                "Portugal (15 villes)",
                "Roumanie (9 villes)",
                "Serbie (18 villes)",
                "Tunisie (4 villes)",
                "Ukraine (12 villes)",
                "Ouganda (2 villes)"
              ]
            },
            "default": [
              "ma"
            ]
          },
          "allCountries": {
            "title": "Tous les pays Glovo",
            "type": "boolean",
            "description": "Parcourt les 21 pays où Glovo est actif (233 villes). Très volumineux : limitez le nombre de villes par pays ET activez le proxy RESIDENTIAL, sinon Glovo bloquera les requêtes (erreur 403).",
            "default": false
          },
          "maxCitiesPerCountry": {
            "title": "Nombre maximum de villes par pays",
            "minimum": 0,
            "type": "integer",
            "description": "0 = toutes les villes connues du pays. Les villes sont classées par importance.",
            "default": 1
          },
          "cities": {
            "title": "Villes",
            "type": "array",
            "description": "Facultatif : villes précises (ex. casablanca, rabat). Si rempli, remplace les villes automatiques des pays choisis.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "URLs de départ",
            "type": "array",
            "description": "URLs Glovo précises : ville, catégorie (…/categories/restaurants_1) ou magasin (…/stores/mcdonalds-cas). Utile pour compléter la liste des magasins d'une ville.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "useCountryCities": {
            "title": "Parcourir aussi les villes des pays choisis",
            "type": "boolean",
            "description": "Décochez pour ne traiter que les « URLs de départ » (utile pour cibler quelques magasins précis).",
            "default": true
          },
          "languageCode": {
            "title": "Langue",
            "type": "string",
            "description": "Facultatif : force la langue des pages (fr, en, es…). Par défaut, la langue principale du pays."
          },
          "scrapeMenus": {
            "title": "Récupérer les menus et les produits",
            "type": "boolean",
            "description": "Ouvre chaque magasin pour récupérer ses plats avec prix et options. Fonctionne pour les restaurants et la nourriture ; les boutiques et supermarchés rangent leurs produits dans des rayons chargés dynamiquement, seule leur fiche magasin est alors enregistrée. Décochez pour n'obtenir que la liste des magasins (beaucoup plus rapide).",
            "default": true
          },
          "scrapeShopAisles": {
            "title": "Explorer les rayons des boutiques et supermarchés",
            "type": "boolean",
            "description": "Pour les magasins qui n'affichent pas leur catalogue directement (supermarchés, parapharmacies, boutiques), l'Actor parcourt les rayons pour récupérer tous les produits. Plus complet, mais plus de requêtes.",
            "default": true
          },
          "maxAisleDepth": {
            "title": "Profondeur des rayons",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Nombre de niveaux de rayons explorés (rayon, sous-rayon, etc.).",
            "default": 2
          },
          "maxStoresPerCity": {
            "title": "Nombre maximum de magasins par ville",
            "minimum": 0,
            "type": "integer",
            "description": "0 = tous les magasins trouvés. Attention : une ville entière avec tous ses produits peut demander plus d'une heure.",
            "default": 25
          },
          "maxProductsPerStore": {
            "title": "Nombre maximum de produits par magasin",
            "minimum": 0,
            "type": "integer",
            "description": "0 = tout le catalogue du magasin. Les supermarchés peuvent contenir plus de 10 000 produits.",
            "default": 250
          },
          "includeClosedStores": {
            "title": "Inclure les magasins fermés",
            "type": "boolean",
            "description": "Les magasins fermés au moment du run restent inclus (leur menu est visible).",
            "default": true
          },
          "storeNameContains": {
            "title": "Nom du magasin contient",
            "type": "string",
            "description": "Ne garder que les magasins dont le nom contient ce texte (ex. pizza, mcdonald)."
          },
          "minPrice": {
            "title": "Prix minimum",
            "minimum": 0,
            "type": "integer",
            "description": "Ne garder que les produits à ce prix ou plus."
          },
          "maxPrice": {
            "title": "Prix maximum",
            "minimum": 0,
            "type": "integer",
            "description": "Ne garder que les produits à ce prix ou moins."
          },
          "nameKeywords": {
            "title": "Nom contient",
            "type": "array",
            "description": "Garder les produits dont le nom contient un de ces mots (ex. pizza, tacos).",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Nom ne contient pas",
            "type": "array",
            "description": "Exclure les produits dont le nom contient un de ces mots.",
            "items": {
              "type": "string"
            }
          },
          "categoryKeywords": {
            "title": "Rubrique ou type contient",
            "type": "array",
            "description": "Garder les produits dont la rubrique de menu ou le type de magasin contient un de ces mots (ex. burgers, sushi).",
            "items": {
              "type": "string"
            }
          },
          "trackPriceChanges": {
            "title": "Suivre les prix entre les runs",
            "type": "boolean",
            "description": "Mémorise le prix de chaque plat pour le comparer au run suivant : ancien prix, variation, nouveautés.",
            "default": false
          },
          "onlyChangedProducts": {
            "title": "Seulement les produits modifiés",
            "type": "boolean",
            "description": "N'enregistrer que les nouveaux plats et ceux dont le prix a changé depuis le dernier run.",
            "default": false
          },
          "sendEmailAlerts": {
            "title": "Recevoir les alertes par e-mail",
            "type": "boolean",
            "description": "À la fin du run, envoie un récapitulatif des changements à l'adresse e-mail de votre compte Apify. ⚠ Limite d'Apify : un Actor lancé depuis l'Apify Store tourne en « Limited permissions » et n'a pas le droit d'envoyer d'e-mails — l'envoi échouera et le run le dira dans son journal. Les changements restent de toute façon dans les résultats (champs priceChange, priceChangePercent, stockChanged, isNewProduct). Pour vraiment recevoir les e-mails, copiez cet Actor dans votre compte et passez-le en permissions complètes, ou branchez une intégration Apify (Slack, webhook, Zapier).",
            "default": false
          },
          "alertMinPriceDropPercent": {
            "title": "Baisse de prix minimum pour alerter (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Seuil de déclenchement des alertes.",
            "default": 10
          },
          "maxRequestsPerMinute": {
            "title": "Requêtes par minute",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "Vitesse maximale. Au-delà d'environ 60 requêtes/minute, l'API de Glovo renvoie des erreurs 429 (trop rapide) : 45 est un bon compromis.",
            "default": 45
          },
          "botContact": {
            "title": "Contact du robot",
            "type": "string",
            "description": "E-mail ou URL de contact ajouté au User-Agent du robot (recommandé). Vide = adresse de l'Actor sur Apify."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Aucun proxy par défaut : pour 1 à 3 villes, Glovo répond sans problème. Au-delà (plusieurs pays, ou « Tous les pays Glovo »), activez le proxy Apify RESIDENTIAL : sinon Glovo bloque l'adresse IP avec des erreurs 403 et le run ne ramène rien.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}