{
  "openapi": "3.0.1",
  "info": {
    "title": "Takealot Price Drop Monitor & Scraper - South Africa",
    "description": "Schedule it hourly/daily and get only new products, price drops and price rises from Takealot, with the old price. Search by keyword, department or brand: price, list price, saving, rating, reviews and stock in ZAR. Export JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "OdyeWcg0ch5fpAiAd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~takealot-price-drop-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-takealot-price-drop-monitor",
        "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/neverempty~takealot-price-drop-monitor/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-takealot-price-drop-monitor",
        "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/neverempty~takealot-price-drop-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-takealot-price-drop-monitor",
        "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": "Products to search (keyword, Takealot search URL or product URL)",
            "type": "array",
            "description": "One per line: a product name as you would type it on Takealot (air fryer, iphone 15, lego), the URL of a Takealot search or department page with your filters already set, or the URL of a product page (…/PLID…) to watch that exact product. Up to 50 searches and 1,000 product URLs per run. Leave it empty to run the example: 36 products for air fryer.",
            "items": {
              "type": "string"
            }
          },
          "monitoringMode": {
            "title": "Watch mode: only new products, price drops and price rises",
            "type": "boolean",
            "description": "Schedule it hourly/daily → get only new listings & price drops. The first run returns the current products marked new and remembers their prices. Each later run returns only products that are new to the search (changeType new), cheaper than last time (price_drop) or pricier (price_up) with the previous price and the change in %, or have left the search (removed). A run with no changes returns one free row that says so.",
            "default": false
          },
          "department": {
            "title": "Department",
            "type": "string",
            "description": "Only products from this Takealot department, as in the department page URL: home-kitchen, computers, cellphones, gaming, toys, beauty, baby-toddler, sport, tv-audio-video and so on. With no search words, the whole department is searched. Empty = all departments."
          },
          "brand": {
            "title": "Brands",
            "type": "array",
            "description": "Only products from these brands, as shown on Takealot, for example Russell Hobbs, Defy, Samsung. Empty = all brands.",
            "items": {
              "type": "string"
            }
          },
          "inStockOnly": {
            "title": "In stock only",
            "type": "boolean",
            "description": "Only products Takealot has in stock now.",
            "default": false
          },
          "dealsOnly": {
            "title": "Deals only",
            "type": "boolean",
            "description": "Only products Takealot shows as a featured deal.",
            "default": false
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "number",
            "description": "Only products rated at least this many stars, for example 4. Empty = any rating."
          },
          "minPrice": {
            "title": "Minimum price (ZAR)",
            "minimum": 0,
            "type": "number",
            "description": "Only products priced at least this much in rand. Empty = no minimum."
          },
          "maxPrice": {
            "title": "Maximum price (ZAR)",
            "minimum": 0,
            "type": "number",
            "description": "Only products priced at most this much in rand. Empty = no maximum. In watch mode, a product that moves out of the price range is not reported as removed."
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "priceLowHigh",
              "priceHighLow",
              "rating",
              "newest"
            ],
            "type": "string",
            "description": "The order Takealot lists the results in. With a maximum per search set, it decides which products you get and which ones a watch covers. When every product of a search is wanted, or in watch mode, relevance and top rated are read newest first, so none are skipped and every watch run covers the same products.",
            "default": "relevance"
          },
          "maxResultsPerSearch": {
            "title": "Max products per search",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "How many products to return for each search (in watch mode: how many products to watch). Empty = 100. At most 10,000 per search; split larger searches by department, brand or price range. Each product is returned once per run, even if two searches overlap."
          },
          "minChangePercent": {
            "title": "Watch: smallest price change to report (%)",
            "minimum": 0,
            "maximum": 1000,
            "type": "number",
            "description": "Report a price drop or rise only when the price moved at least this much since it was last reported, for example 5 for 5%. Small moves add up: a product that drops 1% a day is reported once the total reaches this.",
            "default": 1
          },
          "includeUnchanged": {
            "title": "Watch: also return unchanged products",
            "type": "boolean",
            "description": "Return every watched product on every run, with changeType unchanged for those that did not move. Off = only changes (cheaper runs).",
            "default": false
          },
          "watchName": {
            "title": "Watch name",
            "type": "string",
            "description": "Optional. Give each scheduled task its own name so two watches of the same search keep separate memories."
          },
          "resetMonitoringState": {
            "title": "Start the watch over",
            "type": "boolean",
            "description": "Forget what this watch has already returned. The next run behaves like a first run.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}