{
  "openapi": "3.0.1",
  "info": {
    "title": "Coles, Woolworths & ALDI Scraper: Prices, Specials, Unit Prices",
    "description": "Coles, Woolworths and ALDI Australia prices in one format: price, was price, half-price and multibuy specials, unit price per kg / L / each, category, barcode, stock. Search, category, specials or product IDs. Tracks price and special changes. $1.50 per 1,000 products.",
    "version": "1.0",
    "x-build-id": "57MdNzjLJYS4m2dRo"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fairfetch~au-supermarket-prices/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fairfetch-au-supermarket-prices",
        "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/fairfetch~au-supermarket-prices/runs": {
      "post": {
        "operationId": "runs-sync-fairfetch-au-supermarket-prices",
        "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/fairfetch~au-supermarket-prices/run-sync": {
      "post": {
        "operationId": "run-sync-fairfetch-au-supermarket-prices",
        "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": {
          "retailers": {
            "title": "Supermarkets",
            "type": "array",
            "description": "Which supermarkets to search with the search queries below. URLs and product IDs always go to the supermarket they belong to.",
            "items": {
              "type": "string",
              "enum": [
                "coles",
                "woolworths",
                "aldi"
              ],
              "enumTitles": [
                "Coles",
                "Woolworths",
                "ALDI"
              ]
            },
            "default": [
              "coles",
              "woolworths",
              "aldi"
            ]
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Products to search for, one per line (e.g. \"full cream milk\", \"tim tam\", a brand name). Each query runs on every selected supermarket and returns up to \"Max products per query\" products from each, in the supermarket's own relevance order.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Category, specials, search or product URLs",
            "type": "array",
            "description": "Pages copied from the supermarkets' websites, one per line:\n- Woolworths: https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk, https://www.woolworths.com.au/shop/browse/specials/half-price, search or product pages\n- Coles: https://www.coles.com.au/browse/dairy-eggs-fridge/milk, https://www.coles.com.au/on-special, search or product pages\n- ALDI: https://www.aldi.com.au/products/dairy-eggs-fridge/milk/k/1111111160, search or product pages",
            "items": {
              "type": "string"
            }
          },
          "productIds": {
            "title": "Product IDs",
            "type": "array",
            "description": "Specific products to check, one per line, as retailer:id. Woolworths stockcode (woolworths:888140), Coles product number (coles:8150288) or ALDI product number (aldi:398689). The ID is the number at the end of the product page URL. Use this to monitor a fixed basket of products. Per run: up to 2,000 Woolworths and ALDI IDs and up to 400 Coles IDs (Coles takes about 3.5 to 4.5 seconds per product, so 400 IDs take about 25 to 30 minutes); IDs above the limit come back as free error rows. Products you list here are always returned, including Everyday Market items.",
            "items": {
              "type": "string"
            }
          },
          "onlySpecials": {
            "title": "Only products on special",
            "type": "boolean",
            "description": "Return only products that are on special: half price, price cut (with a was price), multibuy (e.g. 2 for $8), Coles specials and ALDI Special Buys. Woolworths filters on its side; for Coles and ALDI (and with change tracking) the Actor reads up to 10x more results to find the specials.",
            "default": false
          },
          "includeMarketplaceItems": {
            "title": "Include Woolworths Everyday Market items",
            "type": "boolean",
            "description": "Woolworths search and category results also list products of third-party sellers (Everyday Market): they are sold and priced by other businesses, have no barcode and are often not groceries. They are left out by default (and not charged). Turn this on to get them, marked marketplace: true with the seller's name.",
            "default": false
          },
          "maxItemsPerQuery": {
            "title": "Max products per query",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum products returned per search query and per URL, for each supermarket. 0 = all results (up to 5,000). With \"Output only changed products\" it is the number of top results checked per query.",
            "default": 30
          },
          "trackChanges": {
            "title": "Track price and specials changes",
            "type": "boolean",
            "description": "Remember every product in a named key-value store in your account, so each later run marks products as new, price_down, price_up, special_started, special_ended, special_changed, back_in_stock, out_of_stock or unchanged. Schedule the Actor (e.g. daily) to get specials alerts.",
            "default": false
          },
          "onlyChanges": {
            "title": "Output only changed products",
            "type": "boolean",
            "description": "Return only products that changed since the previous run. Switches on change tracking. Every product checked costs $0.0003 (event product-checked, once per product and run) and every changed product returned $0.0015, so a daily monitor of 300 products with 10 changes costs about $0.105 a day. The first run of each supermarket saves a baseline and returns nothing for it; changes appear from the second run.",
            "default": false
          },
          "trackingId": {
            "title": "Tracking ID",
            "pattern": "^[A-Za-z0-9_-]{1,60}$",
            "type": "string",
            "description": "Name of the tracking state. Runs with the same ID compare against each other; use different IDs for independent monitors. Letters, numbers, dashes and underscores.",
            "default": "default"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Default: Apify Proxy (included in the price). Woolworths and ALDI use datacenter IPs and Coles uses residential IPs in Australia, because Coles blocks datacenter IPs too often; a supermarket that keeps refusing datacenter IPs is switched to residential for the rest of the run (see the next option). Choose Residential + Australia here to use residential for all three, or your own proxies.",
            "default": {
              "useApifyProxy": true
            }
          },
          "residentialFallback": {
            "title": "Use residential proxy where needed",
            "type": "boolean",
            "description": "With Apify datacenter proxy: read Coles through Apify residential proxy (Australia); switch Woolworths or ALDI to it for the rest of the run if they still refuse a request after 3 fresh datacenter IPs; and repeat a Woolworths search that finds nothing from a datacenter IP once from a residential IP (Woolworths corrects typos only for residential visitors). Included in the price. Turn off to use only datacenter IPs.",
            "default": true
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for a single HTTP request.",
            "default": 30
          },
          "maxRetries": {
            "title": "Max retries per request",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries for network errors, HTTP 5xx and throttling (429), with exponential backoff. Bot-protection pages are retried separately, up to 3 times with a fresh proxy IP.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}