{
  "openapi": "3.0.1",
  "info": {
    "title": "E-commerce Scraper & Price Tracker - Products from Any Store",
    "description": "Product name, price, sale price, stock, SKU, GTIN, brand, rating and variants from any online store's product pages, category pages or sitemap. Schedule it to track price drops and back-in-stock. $2 per 1,000 products, $1 per 1,000 unchanged checks.",
    "version": "0.1",
    "x-build-id": "48wJRkfGwuNNc1VJM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~product-price-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-product-price-tracker",
        "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/tidytools~product-price-tracker/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-product-price-tracker",
        "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/tidytools~product-price-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-product-price-tracker",
        "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": {
          "urls": {
            "title": "Product, category or store URLs",
            "type": "array",
            "description": "One per line: product pages from any online store, category or search result pages (their product links are followed), or a store's home page (product pages are found in its sitemap). Bare domains work too; pasted quotes and brackets are removed, and the same product in several spellings (www, utm_ parameters, #fragment) is read once. Invalid lines become free rows with errorType \"invalid_input\".",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "URLs from a file (optional)",
            "type": "array",
            "description": "Optional: URLs as request objects, or a link to a text/CSV file with one URL per line (\"requestsFromUrl\").",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "discoverProducts": {
            "title": "Category and store pages",
            "enum": [
              "auto",
              "off"
            ],
            "type": "string",
            "description": "What to do with a URL that is not a product page. Listing pages themselves are free; each product read from them is charged.",
            "default": "auto"
          },
          "maxProductsPerInput": {
            "title": "Max products per category or store URL",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many product links are followed from one category, search or home page.",
            "default": 20
          },
          "maxProducts": {
            "title": "Max products per run",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "The run stops after this many products (each one is charged). With the maximum charge per run, this caps the cost.",
            "default": 1000
          },
          "trackChanges": {
            "title": "Track price and stock changes",
            "type": "boolean",
            "description": "Compare every product with the previous run of the same monitor (schedule this Actor daily or hourly): change new / changed / unchanged, price drop or increase with the old price, sale started or ended, back in stock, out of stock. Unchanged products cost a reduced check fee.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the saved price history (letters, digits, dashes). Use one name per product list; empty = derived from the first URL.",
            "default": ""
          },
          "onlyChanges": {
            "title": "Output only changed products",
            "type": "boolean",
            "description": "With tracking on: new and changed products are returned; unchanged products are counted in the run summary instead of being returned (they still cost the reduced check fee).",
            "default": false
          },
          "alertIfPriceBelow": {
            "title": "Alert when the price is at or below",
            "type": "number",
            "description": "Optional, needs \"Track price and stock changes\": tracked product rows get \"conditionMatched\": true while the price is at or below this number (in the product's own currency, also on the first run), and \"conditionReasons\" when they are not. Several alert conditions set together must all hold. A wrong type is rejected before the run starts; a number below 0 ends the run with a free \"invalid_input\" row instead of a wrong threshold."
          },
          "minDropPercent": {
            "title": "Alert when the price drops at least (%)",
            "type": "number",
            "description": "Optional, needs \"Track price and stock changes\": tracked rows get \"conditionMatched\": true when the price fell by at least this percentage since the previous run (100 to 90 matches 10; 100 to 95 does not). A wrong type is rejected before the run starts; a number of 0 or less, or above 100, ends the run with a free \"invalid_input\" row instead of a wrong threshold."
          },
          "restockOnly": {
            "title": "Alert only when a product is back in stock",
            "type": "boolean",
            "description": "Optional, needs \"Track price and stock changes\": rows are \"conditionMatched\": true only when the product was not buyable before and is buyable again (\"back_in_stock\"). Combine it with the price conditions to be alerted about restocks at the right price.",
            "default": false
          },
          "includeVariants": {
            "title": "Include variants",
            "type": "boolean",
            "description": "List each variant (size, color...) with its own SKU, GTIN, price and stock when the store publishes them (up to 100 per product).",
            "default": true
          },
          "includeDescription": {
            "title": "Include product description",
            "type": "boolean",
            "description": "Add the product description as plain text (up to 5,000 characters).",
            "default": false
          },
          "renderJavaScript": {
            "title": "Render JavaScript pages",
            "type": "boolean",
            "description": "When a page has no product data in its HTML, load it once more in a real browser (Cloudflare Browser Rendering). Adds the \"browser-render\" fee only when the rendered page gave a product.",
            "default": false
          },
          "httpVia": {
            "title": "Plain HTTP requests from",
            "enum": [
              "auto",
              "backend",
              "direct"
            ],
            "type": "string",
            "description": "Some stores block requests from data centers. Auto retries from our servers in other regions; the identity stays our honest TidyTools user agent and robots.txt is respected on every route.",
            "default": "auto"
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account."
          },
          "maxConcurrency": {
            "title": "Pages in parallel",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many pages are read at the same time.",
            "default": 8
          },
          "pageTimeoutSecs": {
            "title": "Time limit per page (seconds)",
            "minimum": 15,
            "maximum": 180,
            "type": "integer",
            "description": "A page that takes longer is reported as a timeout (free).",
            "default": 60
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}