{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Products Scraper: prices, stock, variants, changes",
    "description": "Scrape any Shopify store, collection or product URL: products, variants, prices, sales and stock. Track price drops, new and removed products daily, with alerts. Works on headless stores and past 25,000 products.",
    "version": "0.1",
    "x-build-id": "xYtaY3IMTHU2cmd9w"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/usefulapi~shopify-products/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-usefulapi-shopify-products",
        "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/usefulapi~shopify-products/runs": {
      "post": {
        "operationId": "runs-sync-usefulapi-shopify-products",
        "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/usefulapi~shopify-products/run-sync": {
      "post": {
        "operationId": "run-sync-usefulapi-shopify-products",
        "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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Store, collection or product URLs",
            "type": "array",
            "description": "Any Shopify store address (allbirds.com), a collection (…/collections/sale) or a product (…/products/handle). One per line. Headless stores and stores behind a firewall are reached through their myshopify.com address automatically.",
            "default": [
              "https://www.allbirds.com",
              "https://colourpop.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop each store after this many products are saved. 0 = the whole catalogue (past Shopify's 25,000 listing limit too). Through the API, leaving this out means 25.",
            "default": 25
          },
          "outputMode": {
            "title": "One row per",
            "enum": [
              "products",
              "variants"
            ],
            "type": "string",
            "description": "Product: one row per product with its variants inside. Variant: one row per size/colour, best for price and stock sheets.",
            "default": "products"
          },
          "market": {
            "title": "Market (country prices)",
            "type": "string",
            "description": "For stores with a country folder in their URLs: the folder, for example en-ca, en-gb, fr, de-ch. Empty for none. To get another country's prices on a store without folders, use Country instead.",
            "default": ""
          },
          "country": {
            "title": "Country (prices for)",
            "type": "string",
            "description": "2-letter code such as US, CA, GB, DE. Prices, currency and stock then follow that country's market, as a shopper there would see them. Empty = the store's main prices (never the prices for the country of the server running the scraper)."
          },
          "includeDetails": {
            "title": "Barcodes and stock tracking",
            "type": "boolean",
            "description": "Adds each variant's barcode (GTIN/UPC/EAN), whether stock is tracked, subscription (selling plan) info and image alt text. One extra request per product, so slower and billed per product lookup (only for products that pass the filters and, with Only changed products, only for changed ones).",
            "default": false
          },
          "includeStock": {
            "title": "Exact stock quantity",
            "type": "boolean",
            "description": "Units in stock per variant, where the store publishes them: through the store's public storefront key when the store allows it (one request per 100 products, billed as a catalog page), otherwise as printed in the product page (one page read per product, billed as a product lookup only when the page shows a count). Each row says which (stockSource). Stores that publish neither leave it empty.",
            "default": false
          },
          "includePageSections": {
            "title": "Product page sections",
            "type": "boolean",
            "description": "The product page's collapsible sections (for example Dimensions & Care, Shipping & Returns, Ingredients), where the theme uses standard tabs or accordions. One page read per product, billed as a product lookup only when the page has sections.",
            "default": false
          },
          "bestsellerRank": {
            "title": "Best-seller rank",
            "type": "boolean",
            "description": "Shopify's own best-selling order, through the store's public storefront key (1 = best seller). One request per 250 ranks, billed as a catalog page. Not available on stores without a public key; the summary says so.",
            "default": false
          },
          "bestsellerLimit": {
            "title": "Best-seller ranks to read",
            "minimum": 1,
            "maximum": 25000,
            "type": "integer",
            "description": "How many of the best sellers get a rank; products further down get none.",
            "default": 1000
          },
          "includeCollections": {
            "title": "Collections per product",
            "type": "boolean",
            "description": "The collections each product belongs to (for example Sale, New In, Best Sellers), through the store's public storefront key: one request per 100 products, billed as a catalog page. Not available on stores without a key; the summary says so.",
            "default": false
          },
          "includeRelated": {
            "title": "Related products",
            "type": "boolean",
            "description": "Shopify's own 'you may also like' products for each product, with price and stock flag. One request per product, billed as a product lookup when the store returns related products.",
            "default": false
          },
          "relatedLimit": {
            "title": "Related products per product",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many related products to keep per product (Shopify returns at most 10).",
            "default": 6
          },
          "descriptionFormat": {
            "title": "Description",
            "enum": [
              "text",
              "html",
              "both",
              "none"
            ],
            "type": "string",
            "description": "How the product description is saved: plain text (default), the store's HTML, both, or left out to keep rows small.",
            "default": "text"
          },
          "onlyAvailable": {
            "title": "Only in stock",
            "type": "boolean",
            "description": "Keep products with at least one variant for sale (variant rows: only variants for sale).",
            "default": false
          },
          "onSaleOnly": {
            "title": "Only on sale",
            "type": "boolean",
            "description": "Keep variants whose compare-at price is above the price.",
            "default": false
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "In the store's currency, whole units."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "In the store's currency, whole units."
          },
          "vendors": {
            "title": "Vendors (brands)",
            "type": "array",
            "description": "Exact vendor names, any of them.",
            "items": {
              "type": "string"
            }
          },
          "productTypes": {
            "title": "Product types",
            "type": "array",
            "description": "Exact product types, any of them.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Products with any of these tags.",
            "items": {
              "type": "string"
            }
          },
          "titleContains": {
            "title": "Title contains",
            "type": "array",
            "description": "Words or phrases; a product matches if its title contains any of them.",
            "items": {
              "type": "string"
            }
          },
          "createdSince": {
            "title": "Created since",
            "type": "string",
            "description": "A date (2026-10-01) or a period (7 days, 2 weeks). Finds new products."
          },
          "updatedSince": {
            "title": "Updated since",
            "type": "string",
            "description": "A date (2026-10-01) or a period (24 hours, 7 days). Products read one by one (product URLs, past 25,000) have no update date and always pass."
          },
          "trackChanges": {
            "title": "Track changes since the last run",
            "type": "boolean",
            "description": "Each row gets changeType: new, price-drop, price-increase, back-in-stock, sold-out, variants-changed, content-changed (title, description, tags, images) or unchanged; products gone from the store come as removed. The snapshot is kept in a key-value store on your account. Stores and collections up to 25,000 products. With monitoring on, rows also carry price history (the last 5 earlier prices and the day each changed), the day the product was first seen and, with Exact stock quantity on, units sold since the last read, estimated from the stock drop.",
            "default": false
          },
          "changesOnly": {
            "title": "Only changed products",
            "type": "boolean",
            "description": "Save only rows that changed since the last run. The first run saves the baseline and outputs nothing.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Optional. Keeps separate histories for different monitors of the same store (letters, digits, dashes)."
          },
          "notifyUrl": {
            "title": "Send changes to (Slack, Discord, Zapier, Make)",
            "type": "string",
            "description": "Optional. Paste a Slack or Discord webhook link, or a Zapier or Make webhook (which can send you an email). At the end of each run you get a short message: per store, the number of price drops, new, back-in-stock, sold-out and removed products, with up to 10 examples and their links. With Track changes on, a message is sent only when something changed. Free: not billed."
          },
          "beyondLimit": {
            "title": "Read past 25,000 products",
            "type": "boolean",
            "description": "Shopify's listing stops at 25,000 products. When a store is bigger, continue through its collections and its sitemap.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Not needed for most stores. Datacenter proxy only; residential proxy is not supported.",
            "default": {
              "useApifyProxy": 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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}