{
  "openapi": "3.0.1",
  "info": {
    "title": "Coles AU Scraper – Groceries, Prices & Reviews",
    "description": "Scrape Coles.com.au grocery products and customer reviews. Search by keyword, browse categories, or use product/search URLs. Returns name, brand, price, was price, unit price, size, specials, availability, aisle/category, nutrition, allergens, ingredients, ratings, and reviews.",
    "version": "1.0",
    "x-build-id": "B4xJxlaUhMOMh1H7c"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~coles-au-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-coles-au-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/abotapi~coles-au-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-coles-au-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/abotapi~coles-au-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-coles-au-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": {
          "inputMode": {
            "title": "What do you want to scrape?",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose Search / browse to use keywords, categories and filters together. Choose Pasted URLs to scrape product, search, category or On Special links, or bare product IDs."
          },
          "mode": {
            "title": "Legacy input mode",
            "type": "string",
            "description": "Deprecated compatibility field for saved tasks and API integrations. New runs should use inputMode.",
            "default": "search"
          },
          "queries": {
            "title": "Keywords (optional)",
            "type": "array",
            "description": "Words to search for, such as 'milk' or 'tim tam'. Leave empty if you want every product from the selected categories.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Category slugs (optional)",
            "type": "array",
            "description": "Limit keyword searches to specific Coles categories, or browse whole categories when Keywords is empty. Copy the part after /browse/ from a Coles category URL, for example 'dairy-eggs-fridge' or 'dairy-eggs-fridge/milk'.",
            "items": {
              "type": "string"
            }
          },
          "specialsCategory": {
            "title": "Specials / offers category",
            "enum": [
              "",
              "allspecials",
              "allspecials-complete",
              "halfprice",
              "multibuy",
              "onlineonly"
            ],
            "type": "string",
            "description": "Optionally add products from Coles' On Special catalogue. Choose all specials or one offer type. This is an additional source alongside your keyword/category search; use Only products on special below when you want to filter the search results themselves.\n\n• \"All Specials (complete)\" sweeps every department and keeps only products whose price is actually reduced. Coles' own On Special listing is a curated view rather than an index of every markdown — measured across 10 departments, about 7% of genuinely-reduced products never appear in it. This option catches those, at the cost of a much larger walk, so set \"Max products\" to bound the run. Department exclusions and excluded specials categories still apply.",
            "default": ""
          },
          "urls": {
            "title": "Coles Australia URLs / product ids",
            "type": "array",
            "description": "Paste one or more Coles product, search, category or On Special URLs, or bare numeric product IDs.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "name"
            ],
            "type": "string",
            "description": "Order the products collected by this run. Coles supplies relevance order; price and name ordering are applied after collection.",
            "default": "relevance"
          },
          "minRating": {
            "title": "Minimum average rating",
            "enum": [
              "0",
              "3",
              "4",
              "5"
            ],
            "type": "string",
            "description": "Optional. Only keep products whose average customer rating is at least this many stars. Requires enrichment (ratings are collected during 'Fetch product details' / 'Fetch customer reviews'). Products with no reviews are excluded when this is set.",
            "default": "0"
          },
          "specialsOnly": {
            "title": "Only products on special",
            "type": "boolean",
            "description": "Keep only products currently showing a special price or offer. Applies to keyword searches, category browsing and pasted listing URLs.",
            "default": false
          },
          "excludeSpecialsCategories": {
            "title": "Exclude specials categories",
            "type": "array",
            "description": "Drop products belonging to these specials categories instead of collecting and paying to enrich them. Applies to keyword searches, category browsing, the Specials category above and pasted listing URLs. Excluding 'All specials' drops every product currently on special. Leave empty to exclude nothing (existing behaviour).",
            "items": {
              "type": "string",
              "enum": [
                "allspecials",
                "halfprice",
                "multibuy",
                "onlineonly"
              ],
              "enumTitles": [
                "All specials",
                "Half price",
                "Multi buy",
                "Online only"
              ]
            }
          },
          "excludeCategories": {
            "title": "Skip these departments",
            "type": "array",
            "description": "Optional. Departments to skip entirely, so they are never collected and never charged. Use the name from an On Special or category link, for example 'liquorland', 'deliver-more-range' or 'big-pack-value'. A product is skipped when it belongs to any listed department, even if it also appears under one you keep - the same product is often shelved under several at once. To skip promo types (half price, online only) instead, use Exclude specials categories above.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (AUD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or above this amount."
          },
          "maxPrice": {
            "title": "Maximum price (AUD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or below this amount."
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Collect each product's full detail (long description, ingredients, allergens, dietary statement, storage, dimensions, country of origin, GTIN, nutrition panel and images) plus its aggregate rating and star distribution.",
            "default": true
          },
          "fetchReviews": {
            "title": "Fetch customer reviews",
            "type": "boolean",
            "description": "Also collect customer reviews for each product (star rating, title, review text, author display name, date, verified-purchase flag and helpful-vote count), walked across review pages. Note: most Coles grocery products carry no reviews; those records leave the rating/reviews fields absent.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on reviews collected per product when 'Fetch customer reviews' is on. Use 0 for all available reviews.",
            "default": 20
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of products to return across the whole run. Use 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search or category",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum result pages per keyword, category, or URL. Leave empty for all available pages. This does not cap the number of products; Max products does that."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (delta)",
            "type": "string",
            "description": "Optional. ID of a previous run of this actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only NEW products (a delta). Combine both runs' datasets for the full set. Max products then counts only the new products. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned (and billed). State is kept separately for each distinct search/filter setup (or by State key below).",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from your search/filter/detail settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max products or Max pages capped it, or when Resume was used. This returns — and bills — extra synthetic rows.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave enabled to use Apify Proxy (recommended). You can optionally pin specific proxy groups or a country.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}