{
  "openapi": "3.0.1",
  "info": {
    "title": "UK Grocery Prices: Tesco, Sainsbury's, Asda, Aldi, Morrisons",
    "description": "Prices for 5 UK supermarkets (Tesco, Sainsbury's, Asda, Aldi, Morrisons) in one schema: price, was-price, Clubcard/Nectar/More Card price, EAN where published, promotion, stock, scrapedAt. Use it to compare a product or basket across shops. Pay per product returned plus $0.005 a run.",
    "version": "0.2",
    "x-build-id": "CH2oLTGZRuNAl5gSe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yappman~uk-supermarket-price-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yappman-uk-supermarket-price-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/yappman~uk-supermarket-price-scraper/runs": {
      "post": {
        "operationId": "runs-sync-yappman-uk-supermarket-price-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/yappman~uk-supermarket-price-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-yappman-uk-supermarket-price-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": {
          "retailers": {
            "title": "Retailers",
            "type": "array",
            "description": "The shops to run (ids: aldi, sainsburys, asda, tesco, morrisons). Aldi and Sainsbury's by default, so add Tesco, Asda or Morrisons to include them. Search and catalogue modes only: in category and product mode this is ignored, because the shop comes from each URL. Example: [\"tesco\", \"aldi\"] with queries [\"semi skimmed milk\"] prices that product at Tesco and Aldi.",
            "items": {
              "type": "string",
              "enum": [
                "aldi",
                "sainsburys",
                "asda",
                "tesco",
                "morrisons"
              ],
              "enumTitles": [
                "Aldi",
                "Sainsbury's",
                "Asda",
                "Tesco",
                "Morrisons"
              ]
            },
            "default": [
              "aldi",
              "sainsburys"
            ]
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "category",
              "product",
              "catalogue"
            ],
            "type": "string",
            "description": "What the run does. 'search' looks up each query in the selected shops; 'category' and 'product' read the URLs you give; 'catalogue' reads a shop's whole range, for Morrisons only (other shops are skipped), takes about 3 to 4 hours and returns about 26,000 rows, so set the run timeout to 4 hours and keep Max items low. Example: mode \"search\" with queries [\"milk\"] returns milk prices from every selected shop.",
            "default": "search"
          },
          "queries": {
            "title": "Search queries",
            "maxItems": 50,
            "type": "array",
            "description": "Words to search for, such as milk. Search mode only: each query runs in every selected shop. Up to 50 queries.",
            "items": {
              "type": "string",
              "maxLength": 200
            },
            "default": [
              "milk"
            ]
          },
          "categoryUrls": {
            "title": "Category URLs",
            "maxItems": 250,
            "type": "array",
            "description": "Category page links from tesco.com, sainsburys.co.uk, asda.com, aldi.co.uk or groceries.morrisons.com. Leave empty unless you were given a URL; never make one up. Category mode only: the shop comes from each URL. Up to 250 URLs.",
            "items": {
              "type": "string",
              "maxLength": 2048
            },
            "default": []
          },
          "productUrls": {
            "title": "Product URLs",
            "maxItems": 500,
            "type": "array",
            "description": "Product page links from tesco.com, sainsburys.co.uk, asda.com, aldi.co.uk or groceries.morrisons.com. Leave empty unless you were given a URL; never make one up. Product mode only: the shop comes from each URL. Up to 500 URLs.",
            "items": {
              "type": "string",
              "maxLength": 2048
            },
            "default": []
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The most rows the run will save, and every row saved is charged; 0 means no limit, which in catalogue mode is the whole range (about 26,000 rows). Applies to every mode. The limit is split equally between the shops that run, so 100 across five shops gives up to 20 each.",
            "default": 100
          },
          "asdaStoreId": {
            "title": "Asda store id",
            "pattern": "^[0-9]{1,6}$",
            "type": "string",
            "description": "Asda only: the store whose stock the inStock field reports. Leave empty for store 4565, the store asda.com uses before a postcode is entered. Prices are the same in every store, but products not sold at the store you choose are left out. Digits only."
          },
          "outputDataset": {
            "title": "Also append rows to a named dataset",
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-]{0,62}$",
            "type": "string",
            "description": "Optional. Name of a dataset in your account that also receives every row the run saves, created on first use, so repeated runs add up in one place. Rows are charged once, and copying is best effort: it never fails the run. Letters, digits and hyphens only. Example: \"my-uk-grocery-prices\", then read that dataset's items after each run."
          },
          "datasetName": {
            "title": "Name this run's dataset",
            "pattern": "^[a-zA-Z0-9{}-]{1,63}$",
            "type": "string",
            "description": "Optional. Names this run's own dataset once the run succeeds, so it is kept until you delete it. Placeholders: {isoWeek} gives 2026-W40, {date} gives 2026-10-08, and {retailer} gives the shop, or multi when several ran. Letters, digits and hyphens only; skipped with a warning if the name is taken, nothing was saved or the run stopped early."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}