{
  "openapi": "3.0.1",
  "info": {
    "title": "Pick n Pay Scraper: Prices, Specials & Smart Shopper Deals",
    "description": "Scrape Pick n Pay (pnp.co.za) products by search term, category or URL: prices, specials, Smart Shopper member prices with dates, promotions, barcodes, stock and unit prices, store by store. Compare prices across Pick n Pay stores. For SA grocery price monitoring.",
    "version": "0.1",
    "x-build-id": "IgpugsX1dPnC9Mg4v"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zaiq~pick-n-pay-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zaiq-pick-n-pay-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/zaiq~pick-n-pay-scraper/runs": {
      "post": {
        "operationId": "runs-sync-zaiq-pick-n-pay-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/zaiq~pick-n-pay-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-zaiq-pick-n-pay-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 to search for, as you would type them on the site (for example milk, coffee, nappies). A barcode (EAN-13) also works.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Category, search or product URLs",
            "type": "array",
            "description": "Pick n Pay pages: a category (https://www.pnp.co.za/c/coffee1750990951 or any .../c/... link), a search (https://www.pnp.co.za/search/milk) or a product (any .../p/000000000000349246_EA link). A bare product code (349246_EA) works too.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxItemsPerSource": {
            "title": "Max products per search term or URL",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Stop each search term or category after this many products. A product URL always gives one.",
            "default": 100
          },
          "maxItems": {
            "title": "Max products in total",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop the whole run after this many products. 0 means no total limit (each search term or URL still stops at its own maximum, and your spending limit always applies).",
            "default": 0
          },
          "specialsOnly": {
            "title": "Only products on special",
            "type": "boolean",
            "description": "Return only products the site marks as on promotion (a lower price, a member price or a multi-buy deal).",
            "default": false
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "relevance",
              "price_low",
              "price_high"
            ],
            "type": "string",
            "description": "The order the site lists products in. With a product limit, this decides which products you get.",
            "default": "relevance"
          },
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Prices, promotions and stock differ by store. Pick one or more; every product is returned once per store. Leave empty for WC21 Constantia, the store pnp.co.za uses before a shopper sets an address.",
            "items": {
              "type": "string",
              "enum": [
                "WC21",
                "WC27",
                "WC14",
                "WC19",
                "GC12",
                "GC24",
                "GC85",
                "HC06",
                "NC54",
                "HC18",
                "KC03",
                "KC26",
                "HC03",
                "EC16",
                "EC06",
                "NC16"
              ],
              "enumTitles": [
                "WC21 Constantia, Cape Town (the site's default)",
                "WC27 V&A Waterfront, Cape Town",
                "WC14 Canal Walk, Cape Town",
                "WC19 Stellenbosch",
                "GC12 Rosebank, Johannesburg",
                "GC24 Fourways, Johannesburg",
                "GC85 Mall of Africa, Midrand",
                "HC06 Hyper Woodmead, Johannesburg",
                "NC54 Menlyn Mall, Pretoria",
                "HC18 Hyper Centurion",
                "KC03 Umhlanga Crescent, Durban",
                "KC26 Hyper Prospect, Durban North",
                "HC03 Hyper Bloemfontein",
                "EC16 Hyper Moffet Park, Gqeberha",
                "EC06 George",
                "NC16 Polokwane"
              ]
            },
            "default": []
          },
          "storeCodes": {
            "title": "Other stores (code or name)",
            "type": "array",
            "description": "Any other Pick n Pay online store by code (for example GC53) or by name (for example Clearwater Mall). Names are checked against the site's own store list.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Read each product's page",
            "type": "boolean",
            "description": "Adds brand, exact stock level, the unit barcode from the product page, description and category path. One extra request per product, so slower; the price per product is the same.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "By default every request goes through South African home (residential) internet connections, as a shopper in South Africa would browse.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "ZA"
            }
          },
          "maxConcurrency": {
            "title": "Requests at once",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many requests run at the same time. Kept low to stay polite to the site.",
            "default": 6
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}