{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Price Monitor - Competitor Price & Stock Tracker",
    "description": "Track competitor prices across any number of Shopify stores. Get a daily report of price drops, price increases, new products and out-of-stock items - only what actually changed. The first run saves a baseline; the second run onward reports changes.",
    "version": "1.0",
    "x-build-id": "O287uU6d4yLT0Cw4I"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kda_roll~shopify-price-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kda_roll-shopify-price-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/kda_roll~shopify-price-monitor/runs": {
      "post": {
        "operationId": "runs-sync-kda_roll-shopify-price-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/kda_roll~shopify-price-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-kda_roll-shopify-price-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": [
          "storeUrls"
        ],
        "properties": {
          "storeUrls": {
            "title": "Store URLs",
            "type": "array",
            "description": "Shopify store domains to watch. Anything works: 'shop.com', 'https://www.shop.com/collections/all', or 'shop.myshopify.com'.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "monitor",
              "snapshot"
            ],
            "type": "string",
            "description": "monitor = only output what changed since the last run (needs at least one prior run to build a baseline). snapshot = output the full catalog every time.",
            "default": "monitor"
          },
          "trackedEvents": {
            "title": "Events to report",
            "type": "array",
            "description": "Which kinds of change to include in the output.",
            "items": {
              "type": "string",
              "enum": [
                "PRICE_DROP",
                "PRICE_INCREASE",
                "NEW_PRODUCT",
                "REMOVED_PRODUCT",
                "NEW_VARIANT",
                "REMOVED_VARIANT",
                "BACK_IN_STOCK",
                "OUT_OF_STOCK",
                "SALE_STARTED",
                "SALE_ENDED",
                "SALE_DEEPENED",
                "TITLE_CHANGED"
              ],
              "enumTitles": [
                "Price drop",
                "Price increase",
                "New product",
                "Removed product",
                "New variant",
                "Removed variant",
                "Back in stock",
                "Out of stock",
                "Sale started",
                "Sale ended",
                "Sale deepened",
                "Title changed"
              ]
            },
            "default": [
              "PRICE_DROP",
              "PRICE_INCREASE",
              "NEW_PRODUCT",
              "REMOVED_PRODUCT",
              "BACK_IN_STOCK",
              "OUT_OF_STOCK",
              "SALE_STARTED",
              "SALE_ENDED"
            ]
          },
          "minPriceChangePct": {
            "title": "Minimum price change (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Ignore price moves smaller than this percentage. Filters out currency-rounding noise. 0 = report everything.",
            "default": 0
          },
          "minPriceChangeAbs": {
            "title": "Minimum price change (absolute)",
            "minimum": 0,
            "type": "integer",
            "description": "Ignore price moves smaller than this amount in the store's own currency. 0 = report everything.",
            "default": 0
          },
          "keywordFilter": {
            "title": "Keyword filter",
            "type": "array",
            "description": "Only report products whose title, SKU, vendor, type or tags contain one of these words. Leave empty to watch the whole catalog.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Skip products matching any of these words. Applied after the keyword filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeUnavailable": {
            "title": "Include sold-out variants",
            "type": "boolean",
            "description": "Track variants that are currently sold out. Turn off to watch only buyable stock.",
            "default": true
          },
          "generateReport": {
            "title": "Generate HTML + CSV report",
            "type": "boolean",
            "description": "Save a formatted, shareable report to the run's key-value store alongside the raw dataset.",
            "default": true
          },
          "alwaysOutputSummary": {
            "title": "Always return at least one row",
            "type": "boolean",
            "description": "When nothing changed, return a single summary row saying what was checked instead of an empty dataset. Turn off if you only ever want change rows.",
            "default": true
          },
          "escalateBlockedStores": {
            "title": "Retry blocked stores on a residential IP",
            "type": "boolean",
            "description": "Some larger brands block datacenter proxies. When one does, retry it once through a residential IP, and remember to go straight there next run. Uses more proxy bandwidth for those stores only. Turn off to keep costs strictly minimal and have blocked stores reported as failures.",
            "default": true
          },
          "resetBaseline": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Discard stored snapshots and start fresh. This run reports no changes; the next one compares against it.",
            "default": false
          },
          "autoTune": {
            "title": "Auto-tune",
            "type": "boolean",
            "description": "Learn each store's page size, pagination depth and safe request pacing, and reuse it on later runs. Makes repeat runs faster and less likely to be rate-limited.",
            "default": true
          },
          "concurrency": {
            "title": "Concurrent stores",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "How many stores to fetch at once.",
            "default": 5
          },
          "maxPagesPerStore": {
            "title": "Max pages per store",
            "minimum": 1,
            "maximum": 400,
            "type": "integer",
            "description": "Safety cap on pagination. At 250 products per page, 40 pages is 10,000 products.",
            "default": 40
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "How long to wait for a single page of a store's product feed before giving up on it.",
            "default": 30
          },
          "maxRetries": {
            "title": "Max retries per request",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "How many times to retry a timed-out or server-errored request before treating the store as failed.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Recommended. Many larger brands rate-limit (429) the product feed per IP, so a rotating proxy is what keeps them readable. If a store still returns 429, switch the proxy group to RESIDENTIAL.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}