{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Scraper: Products, Stock & Sales Estimates",
    "description": "Shopify scraper for any store: every product and variant with prices by country, stock, sales estimates, best-seller rank, store apps, cross-store comparison and changes-only competitor monitoring. From $0.80 per 1,000 products; compact JSON for AI agents.",
    "version": "0.1",
    "x-build-id": "3y2DULNrjotimupCD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cleanpull~shopify-store-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cleanpull-shopify-store-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/cleanpull~shopify-store-scraper/runs": {
      "post": {
        "operationId": "runs-sync-cleanpull-shopify-store-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/cleanpull~shopify-store-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-cleanpull-shopify-store-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": "Stores",
            "type": "array",
            "description": "Shopify stores by domain or URL, one per line, for example \"colourpop.com\". Each store's whole catalogue is read (up to Max products per store). Headless stores are found through their Shopify address.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Collection and product URLs",
            "type": "array",
            "description": "Optional. Collection pages (brand.com/collections/sale) read only that collection; product pages (brand.com/products/x) read only that product. Mix stores freely.",
            "items": {
              "type": "string"
            }
          },
          "domains": {
            "title": "Domains (alias)",
            "type": "array",
            "description": "Optional. Same as Stores; accepted so inputs from other Shopify actors work unchanged.",
            "items": {
              "type": "string"
            }
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 0,
            "maximum": 25000,
            "type": "integer",
            "description": "Products read per store (Shopify serves 250 a page, up to 25,000). 0 is Summary only.",
            "default": 1000
          },
          "maxProducts": {
            "title": "Max products (alias)",
            "minimum": 0,
            "maximum": 25000,
            "type": "integer",
            "description": "Optional. Same as Max products per store (0 is Summary only)."
          },
          "maxItems": {
            "title": "Max results per run",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop after this many records in total (a cost cap). In monitoring mode, unchanged products checked are billed in bulk and are not capped by it."
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Only products with a variant at or above this price."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Only products with a variant at or below this price."
          },
          "inStockOnly": {
            "title": "In stock only",
            "type": "boolean",
            "description": "Only products with at least one variant available.",
            "default": false
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Only products with a variant below its compare-at price.",
            "default": false
          },
          "vendors": {
            "title": "Vendors / brands",
            "type": "array",
            "description": "Optional. Only these vendors (as the store names them).",
            "items": {
              "type": "string"
            }
          },
          "productTypes": {
            "title": "Product types",
            "type": "array",
            "description": "Optional. Only these product types.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Optional. Only products with any of these tags.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Optional. Only products whose title contains any of these words.",
            "items": {
              "type": "string"
            }
          },
          "publishedWithinDays": {
            "title": "Published within (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Optional. Only products published in the last N days (new arrivals)."
          },
          "createdWithinDays": {
            "title": "Created within (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Optional. Only products created in the last N days. Unlike Published within, the created date does not reset when a store republishes an old product, so it shows what is really new. Both can be combined (a product must pass both)."
          },
          "includeStock": {
            "title": "Stock and sales",
            "type": "boolean",
            "description": "Exact stock per variant where the store publishes it, and, from the second run on, units sold since the last run, sales per day and days of stock left. One extra request per product; billed per product.",
            "default": false
          },
          "includeInventoryDetails": {
            "title": "Stock (alias)",
            "type": "boolean",
            "description": "Optional. Same as Stock and sales."
          },
          "markets": {
            "title": "Prices in other countries",
            "type": "array",
            "description": "Optional. Country codes (GB, DE, CA, AU…). For stores selling internationally with Shopify Markets, each product's prices in those countries and currencies. One extra request per product and country. A country the store does not sell to separately is skipped (not billed); UK is read as GB.",
            "items": {
              "type": "string"
            }
          },
          "bestSellerRank": {
            "title": "Best-seller rank",
            "type": "boolean",
            "description": "Rank products by the store's own best-selling order, with the change since the last run.",
            "default": false
          },
          "bestSellerDepth": {
            "title": "Best-seller depth",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many top sellers to rank.",
            "default": 100
          },
          "storeSummary": {
            "title": "Store summary",
            "type": "boolean",
            "description": "One record per store: catalogue size, price range and median, share on sale, average discount, new products in 7 and 30 days, top vendors, types and tags, theme, apps detected (reviews, email, subscriptions, payments…), social profiles and top sellers.",
            "default": false
          },
          "summaryOnly": {
            "title": "Summary only (no products)",
            "type": "boolean",
            "description": "Read only each store's profile (meta.json): one store row with its name, domain, country, currency and published product and collection counts, charged as one store summary. No products are read or charged; product, stock, market, rank and monitoring options are not used. A quick way to size many stores (for example, keep those under 200 products). A domain that is not a Shopify store gets the usual free row saying why.",
            "default": false
          },
          "compareAcrossStores": {
            "title": "Compare across stores",
            "type": "boolean",
            "description": "Find the same product in several stores (by SKU, else by title) and report who sells it cheapest and the price spread.",
            "default": false
          },
          "waveSummary": {
            "title": "Wave summary",
            "type": "boolean",
            "description": "One extra row (recordType \"waveSummary\", free) after all stores are read: how many stores have a product matching your keywords and filters in the Created or Published window, with each matching store's product count, earliest created and published dates and cheapest matching price. Useful for spotting a product many independent stores added recently.",
            "default": false
          },
          "monitorMode": {
            "title": "Changes only (monitoring)",
            "type": "boolean",
            "description": "Remember each run and return only products that changed since the last run under the same Monitor name. The first run reports every product as new. Unchanged products cost a fraction of a result.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Runs with the same name compare with each other, and share stock history for sales estimates.",
            "default": "default"
          },
          "changeTypes": {
            "title": "Changes to report",
            "type": "array",
            "description": "Which changes count.",
            "items": {
              "type": "string",
              "enum": [
                "new-product",
                "removed-product",
                "price-drop",
                "price-rise",
                "discount-started",
                "discount-ended",
                "sold-out",
                "back-in-stock",
                "variants-changed",
                "best-seller-move"
              ],
              "enumTitles": [
                "New product",
                "Product removed",
                "Price dropped",
                "Price rose",
                "Discount started (compare-at price set)",
                "Discount ended",
                "Sold out (every variant)",
                "Back in stock",
                "Variants changed (a size sold out or restocked, added or removed)",
                "Best-seller rank moved"
              ]
            },
            "default": [
              "new-product",
              "removed-product",
              "price-drop",
              "price-rise",
              "discount-started",
              "discount-ended",
              "sold-out",
              "back-in-stock",
              "variants-changed",
              "best-seller-move"
            ]
          },
          "priceChangePercent": {
            "title": "Minimum price change (%)",
            "minimum": 0,
            "type": "number",
            "description": "Ignore price moves smaller than this percentage.",
            "default": 0
          },
          "rankChangeMin": {
            "title": "Minimum rank move",
            "minimum": 1,
            "type": "integer",
            "description": "Report a best-seller move only when the rank changes by at least this much.",
            "default": 5
          },
          "outputFormat": {
            "title": "Output format",
            "enum": [
              "products",
              "variants"
            ],
            "type": "string",
            "description": "Products keep variants as a list; variants gives one plain row per variant for CSV and Excel.",
            "default": "products"
          },
          "includeDescriptionHtml": {
            "title": "Description HTML",
            "type": "boolean",
            "description": "Also return the product description as HTML (plain text is always included).",
            "default": false
          },
          "fields": {
            "title": "Only these fields",
            "type": "array",
            "description": "Optional. Keep only these fields, for example [\"title\", \"priceMin\", \"variants.sku\"]. Dotted paths reach into lists.",
            "items": {
              "type": "string"
            }
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. The actor picks proxies itself (direct, then datacenter, then residential only if a store blocks the others)."
          },
          "stateStoreName": {
            "title": "History store",
            "type": "string",
            "description": "Optional. A key-value store in your account where this actor keeps what it saw in earlier runs, so it can report changes. Empty: its own store, \"cleanpull-shopify-monitor\". Pick one here when you run it with a scoped API token in Restricted access mode, so the run may use it. Without access to a history store, a run still completes and compares within itself."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}