{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Scraper - Products, Inventory, Variants, SKU, Prices",
    "description": "Shopify products and inventory scraper that recovers shops whose own /products.json is closed: 43 of 47 stores read where the plain path reads 33, measured. Prices, SKUs, barcodes, named options and real stock counts where the shop publishes them. Shopify product scraper, products JSON.",
    "version": "0.1",
    "x-build-id": "vwMb5qiABJA8dpteW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~shopify-inventory-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-shopify-inventory-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/snow_leo_data~shopify-inventory-scraper/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-shopify-inventory-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/snow_leo_data~shopify-inventory-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-shopify-inventory-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": {
          "storeUrls": {
            "title": "Store URLs or domains",
            "type": "array",
            "description": "One line per store. A bare domain (allbirds.com) reads the whole catalogue. A collection URL (.../collections/sale) reads only that collection, asked from the store itself rather than filtered afterwards. A product URL (.../products/handle) reads that single product. A .myshopify.com address works too.",
            "default": [
              "allbirds.com",
              "colourpop.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max products returned",
            "minimum": 0,
            "type": "integer",
            "description": "Hard stop on how many products land in the dataset, counted across all stores. This is a limit on what you are charged for, not on what is read. 0 means no limit; an empty run stops at 200 so a first try stays cheap.",
            "default": 200
          },
          "maxItemsPerStore": {
            "title": "Max products per store",
            "minimum": 0,
            "type": "integer",
            "description": "Quota for each store separately. Without it one large catalogue eats the whole limit and the run looks like a scraper of a single shop. 0 means no per-store quota.",
            "default": 0
          },
          "includeVariants": {
            "title": "Include variants",
            "type": "boolean",
            "description": "Every size, colour and pack as its own record inside the product row: SKU, price, compare-at price and in-stock flag.",
            "default": true
          },
          "includeInventoryDetail": {
            "title": "Include stock counts and barcodes",
            "type": "boolean",
            "description": "Adds barcode (GTIN/EAN/UPC), inventory_quantity, inventory_policy, weight and weight unit. These are missing from the bulk product feed and come from each product's own card, so this costs one extra request per product and makes the run slower.",
            "default": false
          },
          "includeCollections": {
            "title": "Map collection membership",
            "type": "boolean",
            "description": "Fills the collections field with the handles of every collection a product sits in. The bulk feed never says this, so it costs one pass per collection.",
            "default": false
          },
          "includeRecommendations": {
            "title": "Include recommended products",
            "type": "boolean",
            "description": "Adds the handles Shopify's own recommendation engine returns for each product — the shop's real \"customers also bought\" list, not a guess. One extra request per product.",
            "default": false
          },
          "collectionHandles": {
            "title": "Only these collections",
            "type": "array",
            "description": "Handles or titles, for example sale or new-arrivals. Read the list from the store's own /collections.json. Leave empty for the whole catalogue.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleContains": {
            "title": "Title or description contains",
            "type": "array",
            "description": "Keep a product when its title or description contains any of these words. Leave empty to keep everything.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude these words",
            "type": "array",
            "description": "Drop a product when its title or description contains any of these words, for example gift-card or sample.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "vendors": {
            "title": "Vendors",
            "type": "array",
            "description": "Keep only these vendors (brands). A product with no vendor set is kept: missing data is not a mismatch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "productTypes": {
            "title": "Product types",
            "type": "array",
            "description": "Keep only these product types, for example Shoes. A product with no type set is kept.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Keep only products carrying any of these tags. A product with no tags is kept.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest variant price, in the store's own currency. 0 means no lower bound.",
            "default": 0
          },
          "priceMax": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest variant price must not exceed this, in the store's own currency. 0 means no upper bound. A reversed range is swapped silently.",
            "default": 0
          },
          "availableOnly": {
            "title": "In stock only",
            "type": "boolean",
            "description": "Keep only products with at least one variant the store still sells.",
            "default": false
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Keep only products whose compare-at price is above the selling price.",
            "default": false
          },
          "updatedWithinDays": {
            "title": "Changed in the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only products the store touched within this many days. 0 means any age.",
            "default": 0
          },
          "onlyNew": {
            "title": "Only new and changed products",
            "type": "boolean",
            "description": "Remember every product delivered and, on the next run, return only the ones that are new or whose price, stock, variants or text moved. A scheduled run then costs a handful of rows instead of the whole catalogue. Memory is kept per Apify account in a named store.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Emit unchanged products too",
            "type": "boolean",
            "description": "Return untouched products as well, marked UNCHANGED. Off by default so you are not charged twice for the same rows.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Product description",
            "enum": [
              "text",
              "html",
              "both",
              "none"
            ],
            "type": "string",
            "description": "Plain text is easiest to read, HTML keeps the shop's markup, both gives you the two columns, none drops the description entirely and makes rows much smaller.",
            "default": "text"
          },
          "compactOutput": {
            "title": "Compact output",
            "type": "boolean",
            "description": "Keep only the 21 columns most people use: identity, price, discount, stock and SKUs. Useful for AI agents and for spreadsheets.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Drop empty fields",
            "type": "boolean",
            "description": "Leave out keys with no value at all. False and zero are kept: not in stock is an answer, not a gap.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}