{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Price, Restock & New Product Monitor",
    "description": "Watch any list of Shopify stores and get only what changed: price moves, sale starts and ends, back in stock, out of stock, new and removed products, and variant changes. Webhook alerts to Discord, Slack or your own endpoint.",
    "version": "1.0",
    "x-build-id": "pUlUZ4hbwRDsLZ2EN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/muhzuhaib~shopify-change-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-muhzuhaib-shopify-change-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/muhzuhaib~shopify-change-monitor/runs": {
      "post": {
        "operationId": "runs-sync-muhzuhaib-shopify-change-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/muhzuhaib~shopify-change-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-muhzuhaib-shopify-change-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": "Shopify stores to watch",
            "type": "array",
            "description": "One store per line. A bare domain, a full URL or a myshopify handle all work, for example allbirds.com, https://www.gymshark.com/collections/mens or acme.myshopify.com.",
            "default": [
              "www.allbirds.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "changes",
              "baseline"
            ],
            "type": "string",
            "description": "Changes reports what moved since the previous run. Baseline only records the current catalogue as the new reference point and reports no changes.",
            "default": "changes"
          },
          "resetBaseline": {
            "title": "Forget the stored history first",
            "type": "boolean",
            "description": "Discards the saved fingerprint for every store in this run and starts again from the current catalogue. Use it after changing the store list or when a store has migrated.",
            "default": false
          },
          "stateStoreName": {
            "title": "Memory store name",
            "type": "string",
            "description": "The named key-value store that holds the catalogue history between runs. Change it to keep separate watch lists apart, for example one per client. Leave it alone unless you need that.",
            "default": "shopify-change-monitor-state"
          },
          "changeTypes": {
            "title": "Change types to report",
            "type": "array",
            "description": "Leave empty to report every type. Narrowing this is the main way to control both noise and cost, because only the types you keep are charged.",
            "items": {
              "type": "string",
              "enum": [
                "product_added",
                "product_removed",
                "price_increased",
                "price_decreased",
                "sale_started",
                "sale_ended",
                "discount_deepened",
                "discount_reduced",
                "back_in_stock",
                "out_of_stock",
                "partial_sellout",
                "variant_added",
                "variant_removed",
                "sku_changed",
                "title_changed",
                "description_changed",
                "tags_changed",
                "vendor_changed",
                "product_type_changed",
                "handle_changed",
                "images_changed",
                "published",
                "unpublished"
              ],
              "enumTitles": [
                "New product added",
                "Product removed",
                "Price increased",
                "Price decreased",
                "Sale started",
                "Sale ended",
                "Discount deepened",
                "Discount reduced",
                "Back in stock",
                "Out of stock",
                "Partial sellout (some variants gone)",
                "Variant added",
                "Variant removed",
                "SKU changed",
                "Title changed",
                "Description changed",
                "Tags changed",
                "Vendor changed",
                "Product type changed",
                "URL handle changed",
                "Images changed",
                "Published",
                "Unpublished"
              ]
            },
            "default": []
          },
          "minPricePercent": {
            "title": "Minimum price move, percent",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Ignore price changes smaller than this percentage. Useful for stores that round prices constantly. 0 reports every move.",
            "default": 0
          },
          "minPriceAbsolute": {
            "title": "Minimum price move, absolute",
            "minimum": 0,
            "type": "integer",
            "description": "Ignore price changes smaller than this amount in the store's own currency. 0 reports every move.",
            "default": 0
          },
          "includeKeywords": {
            "title": "Only products matching these words",
            "type": "array",
            "description": "Case insensitive. Matched against product title, handle, variant title, SKU, vendor, product type and tags.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip products matching these words",
            "type": "array",
            "description": "Case insensitive, applied after the include list.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "productTypes": {
            "title": "Only these product types",
            "type": "array",
            "description": "Exact match on the Shopify product type, case insensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "vendors": {
            "title": "Only these vendors",
            "type": "array",
            "description": "Exact match on the Shopify vendor, case insensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Only products carrying one of these tags",
            "type": "array",
            "description": "Case insensitive. A product matches if it carries any one of the tags.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "digest": {
            "title": "Digest mode",
            "type": "boolean",
            "description": "Write one summary row per store per run, with the change list carried inside it, instead of one row per change. Fewer rows and one alert, same detection.",
            "default": false
          },
          "includeStoreStats": {
            "title": "Include a statistics row per store",
            "type": "boolean",
            "description": "Catalogue size, out of stock share, on sale share, price range, and the reason for any skip or guard. Keep this on: it is where a skipped store explains itself.",
            "default": true
          },
          "webhookUrl": {
            "title": "Alert webhook URL",
            "type": "string",
            "description": "Optional. Every batch of changes is POSTed here as JSON. Works with Discord and Slack incoming webhooks, n8n, Make, Zapier or your own endpoint."
          },
          "webhookFormat": {
            "title": "Alert format",
            "enum": [
              "generic",
              "discord",
              "slack"
            ],
            "type": "string",
            "description": "Generic sends a full JSON envelope with every change. Discord and Slack send a short readable message their incoming webhooks accept directly.",
            "default": "generic"
          },
          "webhookMode": {
            "title": "Alert batching",
            "enum": [
              "batch",
              "per-change"
            ],
            "type": "string",
            "description": "One request per store per run, or one request per change. Per change can be very chatty on a busy store.",
            "default": "batch"
          },
          "maxChangesPerStore": {
            "title": "Maximum changes per store",
            "minimum": 1,
            "type": "integer",
            "description": "A safety cap so a storewide promotion cannot produce an unexpected bill. The most important changes are kept first and the rest are counted in the statistics row.",
            "default": 500
          },
          "maxChangesPerRun": {
            "title": "Maximum changes per run",
            "minimum": 1,
            "type": "integer",
            "description": "The same cap across every store in the run.",
            "default": 5000
          },
          "maxProductsPerStore": {
            "title": "Maximum products read per store",
            "minimum": 1,
            "type": "integer",
            "description": "Ceiling on catalogue size. Products beyond it are not read and not compared.",
            "default": 10000
          },
          "shrinkGuardPercent": {
            "title": "Shrink guard, percent",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "If a catalogue comes back smaller than this share of the previous run, the comparison is refused rather than reporting thousands of deletions that did not happen. A genuine mass delisting is picked up on the following run.",
            "default": 40
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Per HTTP request.",
            "default": 30
          },
          "maxConcurrency": {
            "title": "Stores read in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Lower this if you are watching many stores on one small host.",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}