{
  "openapi": "3.0.1",
  "info": {
    "title": "Foodland, Thrifty Foods, IGA & FreshCo Scraper — Canada",
    "description": "Prices, promotions and full nutrition panels for 150,000 products across four Canadian grocery banners. Compare the same SKU between stores.",
    "version": "0.0",
    "x-build-id": "F7jPMsgU1x9yv6LoY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alduinxx~foodland-thrifty-foods-iga-freshco-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alduinxx-foodland-thrifty-foods-iga-freshco-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/alduinxx~foodland-thrifty-foods-iga-freshco-scraper/runs": {
      "post": {
        "operationId": "runs-sync-alduinxx-foodland-thrifty-foods-iga-freshco-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/alduinxx~foodland-thrifty-foods-iga-freshco-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-alduinxx-foodland-thrifty-foods-iga-freshco-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": {
          "banners": {
            "title": "Banners",
            "type": "array",
            "description": "Which banners to scrape. Leave all four selected to compare the same product across them — they share one product ID, so the rows line up. With a postal code, only the selected banners that have stores in that province are priced. Ignored if you enter store numbers: each store is priced on its own banner.",
            "items": {
              "type": "string",
              "enum": [
                "foodland",
                "thriftyfoods",
                "iga",
                "freshco"
              ],
              "enumTitles": [
                "Foodland (Ontario and Atlantic Canada)",
                "Thrifty Foods (BC)",
                "IGA (Quebec and New Brunswick)",
                "FreshCo (discount: Ontario, the West, Nova Scotia)"
              ]
            },
            "default": [
              "foodland",
              "thriftyfoods",
              "iga",
              "freshco"
            ]
          },
          "keywords": {
            "title": "Search terms",
            "type": "array",
            "description": "Matched against the product name in the page address, e.g. milk, bread, coffee. Accents, capitals and punctuation don't matter (québon finds Quebon and Québon), and a term with several words, such as chips ahoy, finds products that contain all of them, in any order. Any term can match. Each word is matched anywhere in the name, so short words catch more than you expect ('com' matches 'compliments'); products where the word stands on its own come first. Names are mostly in English; common French grocery words (lait, fromage, biscuits) also find their English word. Every match is listed, free, under Storage → MATCHES. Leave empty to walk the whole catalogue.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product URLs (optional)",
            "type": "array",
            "description": "Product pages to fetch, copied from the address bar of foodland.ca, thriftyfoods.com, iga.ca or freshco.com (English or French). The run fetches exactly these and reads no product list, so it is the most reliable way to get products you already know. Search terms are then not used. Store numbers and postal codes work as usual: each page is priced at the chosen stores of its own banner.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "postalCode": {
            "title": "Postal code (optional)",
            "type": "string",
            "description": "A Canadian postal code, such as H3C 2M2, or just its first three characters (H3C). The run prices products at the nearest store of each selected banner that has stores in that province, and every row shows that store and its distance. Distances are measured from the middle of the postal area. Ignored if you enter store numbers below.",
            "default": ""
          },
          "storesNearby": {
            "title": "Nearest stores to price, per banner",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "With a postal code: how many of the nearest stores of each banner to price, from 1 to 10. Maximum products is shared between all of them.",
            "default": 1
          },
          "storeIds": {
            "title": "Store numbers (optional)",
            "maxItems": 10,
            "type": "array",
            "description": "Instead of a postal code, the store numbers to price at, such as 8093 (IGA Duke, Montréal) or 9778 (FreshCo Jane & Finch, Toronto); up to 10, from any of the four banners. Every run saves the full store list, with each store's banner, as STORES under the Storage tab. Only products a store has its own price for are returned, so you are never charged for another store's price. Leave both this and the postal code empty to get the prices each website shows by default; the storeId column then says which store each price came from. Maximum products is the total across all stores.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxProducts": {
            "title": "Maximum products",
            "minimum": 1,
            "maximum": 150000,
            "type": "integer",
            "description": "Total products across ALL banners and stores — this is your spend ceiling, not a per-banner figure. The budget is divided evenly between the banners you pick, or between the stores when you choose stores. The four catalogues hold about 150,000 products combined.",
            "default": 100
          },
          "includeNutrition": {
            "title": "Include nutrition panel",
            "type": "boolean",
            "description": "Adds calories, fat, sodium, protein and the rest of the panel where the banner publishes it.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Lower this if you see failures. Higher is faster but heavier on the site.",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Required. These banners block unproxied requests, so runs without a proxy fail immediately. Leave this on unless you are supplying your own proxy.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}