{
  "openapi": "3.0.1",
  "info": {
    "title": "Coles, Woolworths & ALDI Scraper",
    "description": "Scrape Australian grocery prices from Coles, Woolworths and ALDI in one run: price, was-price, discount, unit price, stock, category, ingredients and nutrition. Compare the three chains on one row, watch price changes, or list stores near a postcode.",
    "version": "0.0",
    "x-build-id": "3RwHpaqDWWw6gMaoz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lergassy~au-grocery-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lergassy-au-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/lergassy~au-grocery-scraper/runs": {
      "post": {
        "operationId": "runs-sync-lergassy-au-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/lergassy~au-grocery-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-lergassy-au-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": {
          "keywords": {
            "title": "🔎 What to look up",
            "type": "array",
            "description": "Products to look up in every selected chain — <b>milk</b>, <b>nappies</b>, <b>tim tam</b>, <b>olive oil</b>. Each keyword is searched in Coles, Woolworths and ALDI and comes back in one table.",
            "default": [
              "milk"
            ],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "📂 Category pages",
            "type": "array",
            "description": "Whole aisles instead of a keyword. Paste a Coles category link such as <b>https://www.coles.com.au/browse/dairy-eggs-fridge/milk</b>, or an ALDI category key such as <b>970000000</b>. Woolworths does not answer category requests from an anonymous visitor, so use keywords for it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "chains": {
            "title": "🏪 Chains",
            "type": "array",
            "description": "Which supermarkets to read. Leave all three on to compare them.",
            "items": {
              "type": "string",
              "enum": [
                "coles",
                "woolworths",
                "aldi"
              ],
              "enumTitles": [
                "Coles",
                "Woolworths",
                "ALDI"
              ]
            },
            "default": [
              "coles",
              "woolworths",
              "aldi"
            ]
          },
          "output": {
            "title": "📤 What a row should be",
            "enum": [
              "products",
              "comparison",
              "stores"
            ],
            "type": "string",
            "description": "<b>One product per row</b> gives every product of every chain separately. <b>One comparison per row</b> puts the same product from the different chains on one row with the Coles, Woolworths and ALDI price next to each other and names the cheapest. <b>One store per row</b> lists the Woolworths and ALDI supermarkets near a postcode or a pair of coordinates, nearest first.",
            "default": "products"
          },
          "maxProductsPerKeyword": {
            "title": "💯 Products per keyword, per chain",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How deep to go in each chain for each keyword. Thirty is a fast look; raise it to sweep a whole aisle.",
            "default": 30
          },
          "productUrls": {
            "title": "🔗 Product URLs",
            "type": "array",
            "description": "Specific products instead of, or alongside, a search. Paste Coles, Woolworths or ALDI product links — the chain is recognised from the link.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "postcode": {
            "title": "📍 Postcode",
            "type": "string",
            "description": "An Australian postcode, used to find Woolworths and ALDI stores near it in the store mode. Coordinates can be given instead.",
            "default": ""
          },
          "latitude": {
            "title": "Latitude",
            "type": "string",
            "description": "Coordinates instead of a postcode, e.g. <b>-33.8688</b>. Both latitude and longitude must be given.",
            "default": ""
          },
          "longitude": {
            "title": "Longitude",
            "type": "string",
            "description": "The matching longitude, e.g. <b>151.2093</b>.",
            "default": ""
          },
          "colesStoreId": {
            "title": "🏬 Coles store number",
            "type": "string",
            "description": "Set it and Coles rows come back with the aisle the product sits in and the quantity that store has on the shelf, instead of the national range. The number is in the URL of your store on the Coles site.",
            "default": ""
          },
          "includeNutrition": {
            "title": "🥗 Ingredients, allergens and nutrition",
            "type": "boolean",
            "description": "Woolworths ships the label with the product and it is always included. Coles keeps it on the product page, so each Coles product needs one extra request, charged as a separate add-on. ALDI publishes no label data at all.",
            "default": false
          },
          "maxNutritionLookups": {
            "title": "Maximum label lookups per run",
            "minimum": 0,
            "type": "integer",
            "description": "A ceiling on the extra Coles requests, so a large sweep cannot surprise you.",
            "default": 200
          },
          "watchName": {
            "title": "🔔 Watch name — deliver only what changed",
            "type": "string",
            "description": "Give this run a name — <b>weekly-shop</b>, <b>dairy</b> — and every later run under the same name returns only products whose price moved, that went on or off special, that came back in stock, or that are new. Leave empty to get everything found, every time.",
            "default": ""
          },
          "deliverBaseline": {
            "title": "📥 Deliver everything on the first run of a watch",
            "type": "boolean",
            "description": "The first run of a new watch has nothing to compare against. Leave this on to receive the current prices as the starting point; turn it off to start silently and hear only about movements from now on.",
            "default": true
          },
          "resetWatch": {
            "title": "♻️ Forget the prices this watch remembers",
            "type": "boolean",
            "description": "Wipe this watch's memory and start a new baseline on this run.",
            "default": false
          },
          "onSpecialOnly": {
            "title": "🏷️ Only products on special",
            "type": "boolean",
            "description": "Keep only products with a was-price or a special flag.",
            "default": false
          },
          "minDiscountPercent": {
            "title": "📉 Minimum discount, %",
            "minimum": 0,
            "maximum": 95,
            "type": "integer",
            "description": "Keep only products discounted by at least this much. Zero means no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "💲 Maximum price, AUD",
            "minimum": 0,
            "type": "integer",
            "description": "Ignore anything dearer than this. Zero means no limit.",
            "default": 0
          },
          "inStockOnly": {
            "title": "📦 Only what is in stock",
            "type": "boolean",
            "description": "Drop products the chain reports as unavailable.",
            "default": false
          },
          "matchMode": {
            "title": "🔗 How strictly to match products across chains",
            "enum": [
              "same-brand",
              "equivalent"
            ],
            "type": "string",
            "description": "<b>Same brand</b> only ever compares like with like: the same brand, or the three house brands against each other (Coles, Woolworths, ALDI's Farmdale and friends). <b>Equivalent</b> also matches a different brand of the same size and wording — wider, and every row says how confident the match is.",
            "default": "same-brand"
          },
          "maxItems": {
            "title": "Maximum rows per run",
            "minimum": 1,
            "type": "integer",
            "description": "A hard ceiling on what one run delivers and bills.",
            "default": 5000
          },
          "concurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many chain requests to run at once.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is on by default with residential addresses, because Coles refuses datacenter traffic — measured 16 September 2026, when its datacenter pool stopped answering altogether. Woolworths and ALDI are read directly and only fall back to the proxy if they push back.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}