{
  "openapi": "3.0.1",
  "info": {
    "title": "Coles & Woolworths Grocery Price Scraper",
    "description": "Coles and Woolworths prices, specials, unit prices, stock and barcodes in one schema. Search, categories, per-store Coles pricing and price-change alerts.",
    "version": "0.1",
    "x-build-id": "NUTM9HeLXNLhmJxxp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cylindrical_lighthouse~au-grocery-prices/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cylindrical_lighthouse-au-grocery-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/cylindrical_lighthouse~au-grocery-prices/runs": {
      "post": {
        "operationId": "runs-sync-cylindrical_lighthouse-au-grocery-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/cylindrical_lighthouse~au-grocery-prices/run-sync": {
      "post": {
        "operationId": "run-sync-cylindrical_lighthouse-au-grocery-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": {
          "chains": {
            "title": "Supermarkets",
            "type": "array",
            "description": "Which supermarkets to search and to scrape specials from. Category and product URLs are routed automatically by their domain. Allowed values: \"coles\", \"woolworths\". Example: [\"coles\", \"woolworths\"].",
            "items": {
              "type": "string",
              "enum": [
                "coles",
                "woolworths"
              ],
              "enumTitles": [
                "Coles",
                "Woolworths"
              ]
            },
            "default": [
              "coles",
              "woolworths"
            ]
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Product keywords to search on each selected supermarket, as a shopper would type them. One source per keyword per supermarket. Example: [\"milk\", \"coffee beans\", \"nappies size 4\"].",
            "items": {
              "type": "string"
            }
          },
          "specials": {
            "title": "Specials catalogue",
            "enum": [
              "none",
              "all",
              "halfPrice"
            ],
            "type": "string",
            "description": "Also collect the current specials from each selected supermarket. \"all\" = every discounted product (price drops, half price, multibuys), \"halfPrice\" = half-price specials only, \"none\" = skip. Specials change every Wednesday. Example: \"halfPrice\".",
            "default": "none"
          },
          "categoryUrls": {
            "title": "Category URLs",
            "type": "array",
            "description": "Category (aisle) pages to crawl, copied from the browser. Coles: https://www.coles.com.au/browse/dairy-eggs-fridge/milk. Woolworths: https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk. Each URL is one source.",
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product URLs",
            "type": "array",
            "description": "Specific product pages to look up (always includes the barcode). Coles: https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288. Woolworths: https://www.woolworths.com.au/shop/productdetails/62636/pura-full-cream-milk. Unknown products are listed under notFound in the SUMMARY record, not treated as errors.",
            "items": {
              "type": "string"
            }
          },
          "maxItemsPerSource": {
            "title": "Max products per source",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop each source (one keyword on one supermarket, one category URL, or one supermarket's specials) after this many products. Keeps cost predictable. Example: 100.",
            "default": 100
          },
          "maxItems": {
            "title": "Max products in total",
            "minimum": 0,
            "type": "integer",
            "description": "Overall cap on products for the whole run, across all sources. 0 = no overall cap (the per-source limit still applies). Example: 500.",
            "default": 0
          },
          "colesStoreId": {
            "title": "Coles store",
            "type": "string",
            "description": "Price Coles products at a specific store (prices differ by store and region). Enter the store number, or paste the store page URL from coles.com.au/find-stores, e.g. \"313\" or \"https://www.coles.com.au/find-stores/coles/wa/karratha-313\". Leave empty for Coles' default online store. Woolworths prices are always for Woolworths' national default online store (reported in storeId)."
          },
          "includeDetails": {
            "title": "Add Coles barcodes (extra request per product)",
            "type": "boolean",
            "description": "Coles search, category and specials listings do not include the barcode (GTIN). Turn this on to open each Coles product and add it, charged as a separate 'product-details' event. Woolworths listings already include barcodes. Example: true.",
            "default": false
          },
          "monitorPriceChanges": {
            "title": "Only output price changes since last run",
            "type": "boolean",
            "description": "Monitoring mode for scheduled runs: compare every product with the previous run that used the same monitor key, and output only new, changed and removed products (changeType, previousPrice, priceChange, priceChangePct). Unchanged products are checked but not written. Example: true.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Name of the saved price snapshot to compare against. Use a different key for each watch list (each schedule or task), so different inputs never compare against each other. Letters, digits, - and _ only. Example: \"weekly-dairy\".",
            "default": "default"
          },
          "outputUnchanged": {
            "title": "Also output unchanged products",
            "type": "boolean",
            "description": "In monitoring mode, also write unchanged products (changeType = \"unchanged\") so you get a full price list plus the change flags. Example: false.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy for Coles, and the fallback for Woolworths. The default, Apify residential proxy in Australia, is the most reliable, and its cost is included in the price. Woolworths goes through Apify datacenter proxy so its prices stay on Woolworths' national default online store; if that is blocked, it switches to this proxy automatically. Example: {\"useApifyProxy\": true, \"apifyProxyGroups\": [\"RESIDENTIAL\"], \"apifyProxyCountry\": \"AU\"}.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "AU"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}