{
  "openapi": "3.0.1",
  "info": {
    "title": "Voilà Grocery Scraper — Sobeys, IGA & Safeway Prices",
    "description": "Sobeys, IGA & Safeway grocery prices from Voilà (voila.ca) by postal code or province: regular & sale price, unit price, Scene+ and multi-buy deals, stock, dietary labels, nutrition and ingredients. Search, categories or the whole catalogue, in English or French.",
    "version": "0.1",
    "x-build-id": "Oiw8dpCNzthPAEpNj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yugenox~voila-grocery-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yugenox-voila-grocery-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/yugenox~voila-grocery-scraper/runs": {
      "post": {
        "operationId": "runs-sync-yugenox-voila-grocery-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/yugenox~voila-grocery-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-yugenox-voila-grocery-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": {
          "search_terms": {
            "title": "🔎 Search terms",
            "type": "array",
            "description": "Products to look up, e.g. \"eggs\", \"chicken breast\", \"compliments\". Each term is searched in every location. French terms work too (\"lait\", \"fromage\"). Terms are cut to 100 characters (the store's limit).",
            "items": {
              "type": "string"
            }
          },
          "postal_code": {
            "title": "📍 Postal code",
            "type": "string",
            "description": "Canadian postal code. Prices and the product range come from the Voilà catalogue that serves it. Leave blank (and no regions) to use Toronto M5V 2T6."
          },
          "regions": {
            "title": "🗺️ Provinces",
            "type": "array",
            "description": "Scrape the catalogue of whole provinces — each is its own catalogue with its own prices, so pick several to compare. Home delivery exists in Ontario and Quebec; the other provinces are price catalogues for their region.",
            "items": {
              "type": "string",
              "enum": [
                "ON",
                "QC",
                "BC",
                "MB",
                "SK",
                "NS",
                "NB",
                "PE",
                "NL",
                "AB"
              ],
              "enumTitles": [
                "Ontario",
                "Quebec",
                "British Columbia",
                "Manitoba",
                "Saskatchewan",
                "Nova Scotia",
                "New Brunswick",
                "Prince Edward Island",
                "Newfoundland and Labrador",
                "Alberta (catalogue currently empty)"
              ]
            }
          },
          "postal_codes": {
            "title": "More postal codes",
            "type": "array",
            "description": "Extra postal codes, each scraped as its own location in the same run.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "🗂️ Categories",
            "type": "array",
            "description": "Browse categories instead of (or as well as) searching. Use a name (\"Dairy & Eggs\", \"Frozen Pizza\"), a path (\"Dairy & Eggs > Milk\") or a voila.ca category URL (https://voila.ca/categories/farm-boy/WEB1146400).",
            "items": {
              "type": "string"
            }
          },
          "all_products": {
            "title": "Entire catalogue",
            "type": "boolean",
            "description": "Scrape every product in each location's catalogue (Ontario: about 19,000 products in roughly 3 minutes). Search terms and categories are optional when this is on.",
            "default": false
          },
          "include_details": {
            "title": "Nutrition, ingredients & description",
            "type": "boolean",
            "description": "Also fetch each product's page: description, ingredients, storage, nutrition facts, serving size, full category ids and average weight for items sold by weight. One extra request per product.",
            "default": false
          },
          "on_sale_only": {
            "title": "Deals only",
            "type": "boolean",
            "description": "Keep only products with a sale price or a public deal (sale, % off, multi-buy). Scene+ points-only offers don't count.",
            "default": false
          },
          "max_items_per_search": {
            "title": "Max products per search term / category",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Upper limit for each search term and each category, per location. 0 = no limit.",
            "default": 500
          },
          "max_items": {
            "title": "Max products in total",
            "minimum": 0,
            "type": "integer",
            "description": "Stop the whole run after this many products. 0 = no limit.",
            "default": 0
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "fr"
            ],
            "type": "string",
            "description": "Product names, promotions and descriptions in English or French.",
            "default": "en"
          },
          "include_sponsored": {
            "title": "Include sponsored placements",
            "type": "boolean",
            "description": "Search and category pages carry a shelf of paid product placements. Off by default; turn on to keep them, flagged with is_sponsored.",
            "default": false
          },
          "region_ids": {
            "title": "Region IDs",
            "type": "array",
            "description": "Voilà's internal region ids (every row reports its region_id), to pin an exact catalogue.",
            "items": {
              "type": "string"
            }
          },
          "max_concurrency": {
            "title": "Locations in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many postal codes / provinces are scraped at the same time.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Canadian residential proxy is recommended and is the default. Other proxies switch to it automatically if the store refuses them.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "CA"
            }
          },
          "_noResidential": {
            "title": "Run without the RESIDENTIAL proxy",
            "type": "boolean",
            "description": "Internal (canaries): behave exactly like an account without the RESIDENTIAL proxy group.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}