{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Product Scraper & Shopify Price Monitor",
    "description": "Every product of any Shopify store from its public products.json: variants, SKUs, prices, stock, images. Shopify price monitor with price-drop and back-in-stock alerts. $1/1k products, no start fee.",
    "version": "0.1",
    "x-build-id": "7fjY0uOzg1uLK7oUx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~shopify-store-products-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-shopify-store-products-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/tidytools~shopify-store-products-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-shopify-store-products-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/tidytools~shopify-store-products-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-shopify-store-products-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": {
          "stores": {
            "title": "Shopify stores, collections or products",
            "type": "array",
            "description": "Main input: the run needs at least one line here. One per line, any mix of: a store URL or domain (https://www.allbirds.com, kith.com), a collection URL (https://kith.com/collections/footwear: only that collection) or a product URL (https://store.com/products/handle). Market paths such as /en-gb are kept. Invalid lines, sites that are not Shopify stores and stores without a public catalog get an error row and are not charged.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "What to return",
            "enum": [
              "products",
              "detect",
              "collections"
            ],
            "type": "string",
            "description": "Store detection charges only sites that are Shopify stores; other sites get a free row with isShopify: false. Values: products = Products (with variants, prices, stock, images); detect = Is it a Shopify store? (one row per site: store name, currency, country, product count); collections = Collections (one row per collection with product count).",
            "default": "products"
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Products are read up to 250 per request, in the store's own order. Counted before your filters; Shopify serves at most 100 pages (25,000 products) per catalog or collection.",
            "default": 1000
          },
          "maxProducts": {
            "title": "Max products (whole run)",
            "minimum": 1,
            "maximum": 5000000,
            "type": "integer",
            "description": "Stop after this many products returned in total: 10,000 products cost at most $8 on the Free plan.",
            "default": 10000
          },
          "rowPer": {
            "title": "One row per",
            "enum": [
              "product",
              "variant"
            ],
            "type": "string",
            "description": "Variant rows are handy for spreadsheets. Either way you pay once per product. Values: product = Product (variants as a list inside the row); variant = Variant (size/colour rows with SKU, price and stock; product fields repeated).",
            "default": "product"
          },
          "collections": {
            "title": "Only these collections",
            "type": "array",
            "description": "Collection handles or URLs (e.g. sale, mens-footwear). For store inputs, read these collections instead of the whole catalog; each product row gets its collection.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Product contains (any of)",
            "type": "array",
            "description": "Keep products whose title, tags, type, vendor or handle contain at least one of these (case-insensitive), e.g. runner, merino.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Product must not contain",
            "type": "array",
            "description": "Drop products whose title, tags, type, vendor or handle contain any of these, e.g. gift card.",
            "items": {
              "type": "string"
            }
          },
          "vendors": {
            "title": "Vendors (brands)",
            "type": "array",
            "description": "Keep products of these vendors only (exact name, case-insensitive).",
            "items": {
              "type": "string"
            }
          },
          "productTypes": {
            "title": "Product types",
            "type": "array",
            "description": "Keep products of these types only (exact, case-insensitive), e.g. Shoes.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags (any of)",
            "type": "array",
            "description": "Keep products with at least one of these tags (exact, case-insensitive).",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "In the store's currency. Keeps products with at least one variant at or above it."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "In the store's currency. Keeps products with at least one variant at or below it."
          },
          "onlyAvailable": {
            "title": "Only products in stock",
            "type": "boolean",
            "description": "Drop products where no variant is available.",
            "default": false
          },
          "onlyOnSale": {
            "title": "Only products on sale",
            "type": "boolean",
            "description": "Keep products with a compare-at price above the price (a discount).",
            "default": false
          },
          "sinceDate": {
            "title": "Products since",
            "type": "string",
            "description": "A date (2026-09-01) or a period (7 days, 2 weeks, 3 months), compared with the date chosen below. Useful for new arrivals."
          },
          "sinceField": {
            "title": "Date to compare",
            "enum": [
              "publishedAt",
              "createdAt",
              "updatedAt"
            ],
            "type": "string",
            "description": "Which product date \"Products since\" uses.",
            "default": "publishedAt"
          },
          "includeDescription": {
            "title": "Include the description (plain text)",
            "type": "boolean",
            "description": "The product description as plain text.",
            "default": true
          },
          "includeHtml": {
            "title": "Include the description HTML",
            "type": "boolean",
            "description": "Also return the description HTML exactly as the store has it (descriptionHtml).",
            "default": false
          },
          "onlyChanges": {
            "title": "Only new and changed products since the last run",
            "type": "boolean",
            "description": "Price and stock monitoring: remember every product's variant prices, compare-at prices and availability, and return only products that are new or changed since the previous run of the same monitor (with changeType, changes and the previous values). Unchanged products are not output and not charged. The first run returns everything and becomes the baseline.",
            "default": false
          },
          "reportRemoved": {
            "title": "Report removed products (free rows)",
            "type": "boolean",
            "description": "With monitoring on: a free row (changeType: removed) for products that disappeared since the last run. Only when the whole catalog was read and no filter is set, so that \"not read\" is never reported as \"removed\".",
            "default": true
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Runs with the same name are compared with each other (letters, digits, dashes). Use different names for different store lists. Default: \"default\"."
          },
          "httpVia": {
            "title": "Store requests from",
            "enum": [
              "auto",
              "direct",
              "vm"
            ],
            "type": "string",
            "description": "Store JSON is read as plain HTTP. Some stores refuse data-center networks; Auto retries those from a second network. No browser, no bot-check bypassing.",
            "default": "auto"
          },
          "requestIntervalMs": {
            "title": "Pause between requests to the same store (ms)",
            "minimum": 250,
            "maximum": 30000,
            "type": "integer",
            "description": "Polite spacing: by default one request per second per store (a page holds 250 products, so 1,000 products take about 4 seconds). Rate-limited answers (HTTP 429) are retried after the time the store asks for.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Stores in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many stores are read at the same time (each store is still read one request at a time).",
            "default": 3
          },
          "storeTimeoutSecs": {
            "title": "Time limit per store (seconds)",
            "minimum": 60,
            "maximum": 7200,
            "type": "integer",
            "description": "A store that takes longer gets a timeout error row (not charged) so one slow store cannot hold the run.",
            "default": 1800
          },
          "suspiciousChangePercent": {
            "title": "Monitoring guard: suspicious change above (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "With monitoring on: when more than this share of a store's products are new, changed or removed in one run (stores with at least 10 products), or the store now answers as another shop or on another domain, its rows are still output but marked suspiciousChange and not charged. 0 turns the percentage check off (a store move is still flagged).",
            "default": 50
          },
          "updateBaselineOnSuspiciousChange": {
            "title": "Accept suspicious changes as the new baseline",
            "type": "boolean",
            "description": "Off (default): after a suspicious change set the previous baseline is kept, so the next run compares with the old data again and you can check the store first. On: the new data replaces the baseline (the suspicious rows stay free). Turn it on for one run after a store really moved or relaunched.",
            "default": false
          },
          "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. Not needed normally."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}