{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Store Scraper & Price/Stock Change Monitor",
    "description": "Export any Shopify store's full catalog from its domain, then get only what changed: new or removed products, price and stock changes. No login needed.",
    "version": "0.1",
    "x-build-id": "9yjPwuNiIbq5VOPo8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/orbiting_solutions~shopify-catalog-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-orbiting_solutions-shopify-catalog-monitor",
        "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/orbiting_solutions~shopify-catalog-monitor/runs": {
      "post": {
        "operationId": "runs-sync-orbiting_solutions-shopify-catalog-monitor",
        "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/orbiting_solutions~shopify-catalog-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-orbiting_solutions-shopify-catalog-monitor",
        "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": "Stores",
            "maxItems": 500,
            "type": "array",
            "description": "Shopify store domains or URLs, up to 500, e.g. gymshark.com. A collection URL (https://kith.com/collections/mens) limits that store to the collection.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "snapshot",
              "changes",
              "snapshotWithChanges"
            ],
            "type": "string",
            "description": "Snapshot outputs every product. Changes compares against the baseline stored for this watchlist and outputs only what changed (the first run only stores the baseline). Snapshot with changes outputs every product with a changeType.",
            "default": "snapshot"
          },
          "watchlistName": {
            "title": "Watchlist name",
            "pattern": "^[a-z0-9-]{1,30}$",
            "type": "string",
            "description": "Names the baseline kept between runs (key-value store 'shopify-monitor-<name>' in your account). Use different names for independent monitors.",
            "default": "default"
          },
          "collections": {
            "title": "Collections",
            "type": "array",
            "description": "Collection handles to limit every store to, e.g. mens. Empty = whole catalog.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "0 = all products. In change modes a capped crawl does not replace the stored baseline.",
            "default": 0
          },
          "rowPerVariant": {
            "title": "One row per variant",
            "type": "boolean",
            "description": "One row per variant (size/colour) instead of per product. Charged per row.",
            "default": false
          },
          "trackFields": {
            "title": "Changes to track",
            "type": "array",
            "description": "Which differences produce change rows.",
            "items": {
              "type": "string",
              "enum": [
                "price",
                "compareAtPrice",
                "available",
                "added",
                "removed",
                "title",
                "tags",
                "images"
              ],
              "enumTitles": [
                "Price",
                "Compare-at price",
                "Stock (available)",
                "New products/variants",
                "Removed products/variants",
                "Title",
                "Tags",
                "Images"
              ]
            },
            "default": [
              "price",
              "compareAtPrice",
              "available",
              "added",
              "removed"
            ]
          },
          "minPriceChangePercent": {
            "title": "Minimum price change (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Ignore smaller price moves (not output, not charged). The baseline keeps the old price so small moves add up.",
            "default": 0
          },
          "includeInventory": {
            "title": "Include inventory quantity (add-on)",
            "type": "boolean",
            "description": "One extra lookup per product. Adds inventoryQuantity where the store makes it public; charged only for those products. Snapshot modes only.",
            "default": false
          },
          "includeDescriptionHtml": {
            "title": "Include description HTML",
            "type": "boolean",
            "description": "Off keeps rows about 70% smaller.",
            "default": false
          },
          "originFallback": {
            "title": "myshopify.com fallback",
            "enum": [
              "headlessOnly",
              "never",
              "always"
            ],
            "type": "string",
            "description": "Headless stores (custom front end, products.json 404) are read from their <shop>.myshopify.com origin. Stores that put a bot challenge on their own domain are reported as blockedByStore unless you choose 'always'.",
            "default": "headlessOnly"
          },
          "resetState": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Deletes the stored baseline for these stores before crawling, so this run becomes a new baseline.",
            "default": false
          },
          "maxConcurrencyPerStore": {
            "title": "Max concurrent requests per store",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Halved automatically on HTTP 429.",
            "default": 4
          },
          "storeTimeBudgetSecs": {
            "title": "Time budget per store (seconds)",
            "minimum": 60,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for each store's crawl (listing pages, Storefront API top-up past 25,000 products). Default 1,200 s (20 min). If it runs out before the catalog is read, the store ends as notProcessed and is charged nothing. Very large stores (Fashion Nova, Burga: 100,000+ products) may need up to 3,600 s.",
            "default": 1200
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Default: Apify datacenter proxy, one session per store, switched to a new session (up to 3 times) when Shopify answers with a bot challenge or HTTP 429. A store that stays challenged is reported as 'blocked' (free). Challenges are never solved.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}