{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Store Products Scraper",
    "description": "Shopify products scraper for catalog and variant exports: prices, discounts, SKUs, availability and images. Export CSV or JSON from public store feeds, with one row per product or variant. Review run summaries for failures and budget-limited exports. No Shopify API key required.",
    "version": "94.97",
    "x-build-id": "RNCyacFbciJs4qUIB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/webdatatools~shopify-products-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-webdatatools-shopify-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/webdatatools~shopify-products-scraper/runs": {
      "post": {
        "operationId": "runs-sync-webdatatools-shopify-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/webdatatools~shopify-products-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-webdatatools-shopify-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",
        "required": [
          "stores"
        ],
        "properties": {
          "stores": {
            "title": "Store URLs",
            "type": "array",
            "description": "Enter the Shopify store URLs to scrape, e.g. https://www.allbirds.com. A bare domain such as allbirds.com also works. Every store is read from its public products.json feed; headless stores fall back to sitemap + structured data. Non-Shopify or password-protected stores get one diagnostic instead of crashing the run.",
            "default": [
              "https://www.allbirds.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Enter the maximum number of products to fetch per store, e.g. 250. Products are paged 250 at a time from products.json, so 250 is a single page; raise it for a full catalog export, up to 20000.",
            "default": 100
          },
          "collectionHandles": {
            "title": "Collection handles (optional)",
            "type": "array",
            "description": "Optionally enter collection handles to scrape instead of the whole catalog, e.g. mens-shoes. Each handle is fetched from /collections/<handle>/products.json. Leave empty to scrape every product in the store via /products.json.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeVariants": {
            "title": "One row per variant",
            "type": "boolean",
            "description": "Keep this on to get one dataset row per product variant (size/color), with its own price, SKU and stock. Turn it off to get one row per product with aggregated minPrice, maxPrice and anyAvailable instead.",
            "default": false
          },
          "onlyAvailable": {
            "title": "Only available (in-stock) items",
            "type": "boolean",
            "description": "Keep this off to include out-of-stock variants and products. Turn it on to drop any variant (or, in product mode, any product) that is not currently available for sale.",
            "default": false
          },
          "monitorChanges": {
            "title": "Only output changes since the last run",
            "type": "boolean",
            "description": "Keep this off for a full export. Turn it on for scheduled monitoring: the first run saves a baseline (no rows), later runs output only new, price_drop, price_increase, back_in_stock, sold_out and removed items with changeType, previousPrice and previousAvailable. Snapshots are kept in your named key-value store shopify-products-scraper-state, separately for each store, collections, mode, filter, product limit and tracking ID. Failed, empty or budget-limited results are not compared and do not update the snapshot.",
            "default": false
          },
          "trackingId": {
            "title": "Tracking ID (optional)",
            "maxLength": 100,
            "type": "string",
            "description": "Optionally enter a name, e.g. weekly-price-watch, to keep a separate change snapshot for the same store and settings. Used only when change monitoring is on."
          },
          "includeRemoved": {
            "title": "Report removed items",
            "type": "boolean",
            "description": "Keep this on to output a removed row when a product (or variant) from the previous snapshot is missing from a complete result. With onlyAvailable on, items that go out of stock disappear and are reported as removed. Used only when change monitoring is on.",
            "default": true
          },
          "structuredDataFallback": {
            "title": "Headless store fallback",
            "type": "boolean",
            "description": "Keep this on to still export stores whose products.json feed is blocked or missing (headless Shopify storefronts such as Hydrogen answer 403/404). The Actor then reads product URLs from the store sitemap and product data from each page's schema.org structured data. Those rows are marked dataSource = \"jsonld\"; Shopify variant IDs, compare-at prices and timestamps are not published there and stay null. Turn it off to fail such stores instead.",
            "default": true
          },
          "includeInventory": {
            "title": "Real stock counts and barcodes",
            "type": "boolean",
            "description": "Keep this on to read each product's public JSON for barcodes and real stock counts (inventoryQuantity), at no extra charge. It adds one request per product. Stores that hide counts are reported as inventoryAccuracy = \"not_published\"; if the store blocks the endpoint or the run nears its timeout, enrichment stops and rows say \"not_checked\". Turn it off for the fastest catalog-only export.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Enter how many stores to scrape in parallel, e.g. 3. Pages within a single store are always fetched one at a time because Shopify rate-limits products.json; raise this only to speed up runs with many different stores.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}