{
  "openapi": "3.0.1",
  "info": {
    "title": "Coles Scraper & Price Tracker - Specials, Barcodes & Stock (AU)",
    "description": "Coles Australia (coles.com.au) scraper and price tracker: prices, half-price, multibuy and online-only specials, unit prices, stock by store or postcode. Find products by barcode (EAN) or product ID. Track price drops and ended specials between runs. Nutrition, allergens, full catalogue.",
    "version": "0.0",
    "x-build-id": "WlvIIYYKkbLlbToBG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/aussie-grocery-data~coles-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-aussie-grocery-data-coles-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/aussie-grocery-data~coles-scraper/runs": {
      "post": {
        "operationId": "runs-sync-aussie-grocery-data-coles-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/aussie-grocery-data~coles-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-aussie-grocery-data-coles-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": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Words you would type in the Coles search box, one per line, e.g. \"milk\", \"tim tam\".",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Coles links",
            "type": "array",
            "description": "Coles category links (coles.com.au/browse/...), product links (/product/...), search links, the specials page (/on-special) or one department's specials (/on-special/bakery). A filter_Special=halfprice, multibuy or onlineonly in a specials link is kept.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "productIds": {
            "title": "Coles product numbers",
            "type": "array",
            "description": "The number at the end of a Coles product link, e.g. 8150288 from coles.com.au/product/coles-full-cream-milk-3l-8150288. Fetched 24 at a time, so long lists are fast and cheap. Rows have no stock count (Coles does not give one this way).",
            "items": {
              "type": "string"
            }
          },
          "barcodes": {
            "title": "Barcodes",
            "type": "array",
            "description": "EAN/UPC barcodes (the digits under the bars), e.g. 9300601186945. Coles cannot search by barcode, so they are looked up in an index of ~22,800 Coles barcodes and every match is confirmed with Coles. Barcodes not found are listed in RUN_SUMMARY with the reason.",
            "items": {
              "type": "string"
            }
          },
          "specials": {
            "title": "Every product on special",
            "type": "boolean",
            "description": "All products on special this week (about 8,000 rows, about US$7.90). On Apify's free plan (US$5 credit) the run stops after roughly 5,000: pick one kind of special below, or get the rest later with Continue from earlier results.",
            "default": false
          },
          "specialsType": {
            "title": "Kind of special",
            "enum": [
              "all",
              "halfprice",
              "multibuy",
              "onlineonly"
            ],
            "type": "string",
            "description": "With Every product on special: all of them, or only one kind, filtered by Coles itself. On 2026-10-20 Coles had about 1,950 half price, 1,940 multibuy and 280 online-only specials.",
            "default": "all"
          },
          "fullCatalog": {
            "title": "Full catalogue",
            "type": "boolean",
            "description": "Every department (about 25,000 different products; tobacco excluded). Large run.",
            "default": false
          },
          "onlySpecials": {
            "title": "Only products on special",
            "type": "boolean",
            "description": "Keep only rows that are on special or multibuy. You are not charged for skipped products.",
            "default": false
          },
          "storeIds": {
            "title": "Store IDs",
            "type": "array",
            "description": "Coles store numbers for local prices and stock, e.g. 313 from coles.com.au/find-stores/coles/wa/karratha-313. Each store returns its own rows. Empty = Coles' default online store.",
            "items": {
              "type": "string"
            }
          },
          "postcodes": {
            "title": "Postcodes",
            "type": "array",
            "description": "Australian postcodes. Each one adds its nearest Coles store (or several, see below) to the stores scraped. Works offline from a directory of 877 Coles supermarkets.",
            "items": {
              "type": "string"
            }
          },
          "storesPerPostcode": {
            "title": "Stores per postcode",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many of the nearest stores to use for each postcode.",
            "default": 1
          },
          "storeDirectory": {
            "title": "Output store details",
            "type": "boolean",
            "description": "Add a row for each store: address, phone, location, trading hours. All 877 stores, or only the stores picked by Store IDs / Postcodes. Can be run on its own.",
            "default": false
          },
          "includeDetails": {
            "title": "Include barcode, ingredients, allergens and nutrition",
            "type": "boolean",
            "description": "Opens each product page. Slower, and charged as an extra event per product.",
            "default": false
          },
          "maxItemsPerSource": {
            "title": "Max products per search term / link",
            "minimum": 0,
            "type": "integer",
            "description": "Limits each search term and link. 0 = no limit. Does not apply to \"Every product on special\" or \"Full catalogue\", which always return everything (use \"Max products in total\" to limit those).",
            "default": 100
          },
          "maxItems": {
            "title": "Max products in total",
            "minimum": 0,
            "type": "integer",
            "description": "Stops the run after this many rows. 0 = no limit.",
            "default": 0
          },
          "continueFrom": {
            "title": "Continue from earlier results",
            "type": "array",
            "description": "Pick the dataset of one or more earlier runs (e.g. one that stopped at its cost limit). Products and stores already in them are skipped and not charged, so you only pay for what is new."
          },
          "trackChanges": {
            "title": "Track changes",
            "type": "boolean",
            "description": "Compare with the previous run of the same tracking name: each row gets change (new, priceDown, priceUp, specialStarted, specialEnded, backInStock, outOfStock, removed, notSoldAtStore or unchanged), previousPrice and priceChange. Products that left the listing are checked with Coles for their price now, never assumed gone. The first run saves the baseline. Made for scheduled runs.",
            "default": false
          },
          "trackingName": {
            "title": "Tracking name",
            "type": "string",
            "description": "Use one name per kind of run (e.g. weekly-specials, my-store-dairy), so each compares with its own last run. Letters, digits and dashes. Saved in your Apify storage as coles-tracking-<name>.",
            "default": "default"
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "With Track changes: leave out unchanged products. You are not charged for them.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Pages fetched at the same time (1-16).",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Coles blocks most non-Australian and datacenter addresses. Australian residential is the default and recommended.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}