{
  "openapi": "3.0.1",
  "info": {
    "title": "ALDI Australia Scraper & Price Tracker",
    "description": "ALDI Australia scraper and price tracker: grocery prices, unit prices per kg or litre, pack sizes, Lower Prices and Special Buys with their on-sale dates, for any keyword, aisle or the whole range, at the ALDI store or postcode you choose. Track price changes between runs. No personal data.",
    "version": "0.1",
    "x-build-id": "YOwUFV5VmYXDeMoBT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~aldi-australia-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-aldi-australia-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/myth84~aldi-australia-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-aldi-australia-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/myth84~aldi-australia-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-aldi-australia-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": {
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Enter one search per line, as you would type it on aldi.com.au, e.g. <code>milk</code>, <code>coffee beans</code> or <code>chicken</code>. A keyword returns every ALDI product that matches (ALDI's range is small). Prefilled with <code>milk</code>: clear it to list only aisles, URLs, the Special Buys or the whole range. Optional: with nothing else to read, the Actor searches milk.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Aisles",
            "type": "array",
            "description": "ALDI aisles to list in full: a name, a slug, a slug path, an aisle key or an aisle URL copied from aldi.com.au, e.g. <code>Fruits & Vegetables</code>, <code>dairy-eggs-fridge/milk</code>, <code>lower-prices</code> or <code>https://www.aldi.com.au/products/pantry/k/970000000</code> (read by the Actor, never opened). An unknown aisle is left out with a message. Default empty: keywords are enough.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "ALDI URLs",
            "type": "array",
            "description": "URLs copied from aldi.com.au, read by the Actor (never opened): an aisle (<code>https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000</code>), the whole range (<code>/products</code>), a search (<code>/results?q=milk</code>: only the words are read), a product (<code>/product/&lt;name&gt;-&lt;sku&gt;</code>, one request each) or Special Buys (<code>/special-buys/2026-10-28?theme=Pet%20Essentials</code>). Default empty.",
            "items": {
              "type": "string",
              "pattern": "^https?://(www\\.)?aldi\\.com\\.au/"
            },
            "default": []
          },
          "specialBuys": {
            "title": "Special Buys",
            "type": "boolean",
            "description": "List every current and upcoming ALDI Special Buy: one search per theme of the Special Buys calendar (e.g. Gardening, Pet Essentials), with the on-sale date of each product. maxResults caps all the themes together. Default off.",
            "default": false
          },
          "wholeRange": {
            "title": "Whole range",
            "type": "boolean",
            "description": "List the whole ALDI range of the store (about 3,300 products at build time, 60 per request): set maxResults to 0 to get everything, and sort by name for a stable order. Default off.",
            "default": false
          },
          "storeId": {
            "title": "ALDI store id",
            "pattern": "^[A-Za-z]\\d{3}$",
            "type": "string",
            "description": "Id of the ALDI store whose prices and range you want: a letter and 3 digits, e.g. <code>G452</code> (Glenmore Park NSW, the site's default), <code>G048</code> (Joondalup WA) or <code>G284</code> (Fitzroy VIC). Leave empty to use a postcode instead, or the default G452. Not with postcode."
          },
          "postcode": {
            "title": "Postcode",
            "pattern": "^\\d{4}$",
            "type": "string",
            "description": "Australian postcode: the Actor uses the nearest ALDI store and reports it in the store columns, e.g. <code>6000</code> (Perth), <code>3000</code> (Melbourne) or <code>4000</code> (Brisbane). Leave empty to use the store id (default G452). Not with storeId."
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Keep only these brands, as ALDI writes them, e.g. <code>FARMDALE</code>, <code>CHOCEUR</code> or <code>DAIRY FINE</code> (upper case is applied). Each brand is searched separately for every keyword, aisle and theme; maxResults caps each source with all its brands. Default empty: every brand.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "name_asc",
              "name_desc"
            ],
            "type": "string",
            "description": "Order of the results. Relevance (the ALDI default), price low to high, price high to low and name A to Z were validated at build time; name Z to A is used by other tools but not verified yet. Default relevance.",
            "default": "relevance"
          },
          "maxResults": {
            "title": "Maximum products per search",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop each source (a keyword, an aisle, a URL, the Special Buys, the whole range) after this many unique products; you are never charged for more. One request holds 60 products. 0 means everything, up to 5,000. Default 60; the form is prefilled with 20 for a quick first run.",
            "default": 60
          },
          "markPromotions": {
            "title": "Flag ALDI promotions",
            "type": "boolean",
            "description": "Fill promotionLabels with the promotion aisles listing each product (Lower Prices, Super Savers, Limited Time Only) at the store: about 12 extra requests per run, at no charge, these lookups add no row. Special Buys are flagged in any case. Default on.",
            "default": true
          },
          "monitorPrices": {
            "title": "Monitor prices",
            "type": "boolean",
            "description": "Off (default): every product is returned and the four monitoring columns stay null. On: every product is compared with the previous run of the same search or product list, by ALDI sku and store, and maxResults becomes the number of products compared per source.",
            "default": false
          },
          "onlyChanges": {
            "title": "Return only changes",
            "type": "boolean",
            "description": "With price monitoring on: return and charge only the new products and the products whose price changed since the previous run; a run without any change succeeds with an empty dataset. Off (default): every compared product is returned with its changeType (new, price_changed, unchanged). Recommended for scheduled runs.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store",
            "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$",
            "type": "string",
            "description": "Name of the key-value store, in your account, that keeps the previous prices (one record per search and ALDI store, one for the product URLs), e.g. <code>aldi-dairy-weekly</code>. Runs sharing a name share the records; use one name per schedule. Letters, digits and dashes only, at most 63 characters; upper case is lowered. Default aldi-au-price-monitor.",
            "default": "aldi-au-price-monitor"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy used for the requests to ALDI. Default: Apify proxy, automatic datacenter group, the configuration validated for ALDI Australia, its traffic included in the price. If ALDI refuses it for a long time, choose the RESIDENTIAL group with country AU; your own proxy URLs are accepted too.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Safety cap on the requests of one run, preparation, retries and product URLs included. Default 500: about 29,000 products at 60 per request, far above a usual run (the whole range takes about 70 requests).",
            "default": 500
          },
          "maxConcurrency": {
            "title": "Parallel searches",
            "minimum": 1,
            "maximum": 4,
            "type": "integer",
            "description": "Searches read at the same time, each on its own proxy session. Lower it to 1 if ALDI refuses many requests (the log says so). Default 2: the pace validated at build time.",
            "default": 2
          },
          "delayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause between two page requests of the same search, in milliseconds; 0 disables the pause. Default 400: ALDI served every page at this pace at build time.",
            "default": 400
          },
          "debugStoreHtml": {
            "title": "Store raw API answers",
            "type": "boolean",
            "description": "Debugging only: save every answer of ALDI (JSON, or the refusal page) in the run's key-value store. Uses storage and slows the run down a little. Default off: not needed to get the rows.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}