{
  "openapi": "3.0.1",
  "info": {
    "title": "Shop Catalog & Price Tracker",
    "description": "Shopify, WooCommerce and other shops: track prices and stock on a schedule in one schema (brand, GTIN/MPN/SKU, price, currency, stock, variants). Only changed products, price history kept. Public data only, robots.txt respected.",
    "version": "0.2",
    "x-build-id": "DgNLYAGwPJL5njzfG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/datafeed~shopify-catalog-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-datafeed-shopify-catalog-tracker",
        "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/datafeed~shopify-catalog-tracker/runs": {
      "post": {
        "operationId": "runs-sync-datafeed-shopify-catalog-tracker",
        "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/datafeed~shopify-catalog-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-datafeed-shopify-catalog-tracker",
        "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": "Shops",
            "type": "array",
            "description": "Up to 200 public shop domains (Shopify, WooCommerce or any shop with schema.org product data), e.g. shop.example.com. An entry can also be an object {\"domain\", \"platform\", \"feedUrl\", \"collections\", \"label\"}: platform forces one source; feedUrl is a Google Merchant RSS/Atom feed the shop publishes on its own domain; collections (Shopify only) watches only those collection handles."
          },
          "platform": {
            "title": "Source",
            "enum": [
              "auto",
              "shopify",
              "woocommerce",
              "structured-data",
              "feed"
            ],
            "type": "string",
            "description": "auto: Shopify /products.json, then the WooCommerce Store API, then sitemaps + schema.org Product data on product pages (a feedUrl is tried first). The source found on the first check is kept for that shop. Or force one source for all shops.",
            "default": "auto"
          },
          "matchByGtin": {
            "title": "Match the same product across shops (GTIN)",
            "type": "boolean",
            "description": "Adds one row per GTIN (EAN/UPC) found in two or more of the shops in this run, with every shop's price, currency and stock. Each match row is charged like a product row.",
            "default": false
          },
          "reportChangeTypes": {
            "title": "Change types to report",
            "type": "array",
            "description": "Empty = all: new_product, removed_product, price_drop, price_increase, sale_started, sale_ended, back_in_stock, out_of_stock, new_variant, removed_variant. Changes of other types are still recorded in the history.",
            "items": {
              "type": "string"
            }
          },
          "confirmRemovals": {
            "title": "Confirm removed products",
            "type": "boolean",
            "description": "Report a product as removed only when it is missing on two checks in a row (a catalog that changes while it is paged through can skip a product once).",
            "default": true
          },
          "emitBaselineProducts": {
            "title": "Output the full catalog on the first run",
            "type": "boolean",
            "description": "Off: the first run of a store only stores the baseline and returns one free 'baseline_summary' row (counts, a sample, next step); one store-checked-unchanged event per started 1,000 products is charged. On: every product is also output once as a 'baseline' row, charged like a change row.",
            "default": false
          },
          "historyPerVariant": {
            "title": "History points per variant",
            "minimum": 2,
            "maximum": 500,
            "type": "integer",
            "description": "Price / compare-at price / availability points kept per variant (one point per change).",
            "default": 30
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 250,
            "maximum": 50000,
            "type": "integer",
            "description": "Products read per store (250 per request). Products past the limit are not compared and never reported as removed.",
            "default": 10000
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store that keeps catalogs and history between runs. Use one schedule per store name.",
            "default": "shopify-catalog-tracker"
          },
          "perHostDelayMs": {
            "title": "Delay between requests to one store (ms)",
            "minimum": 1000,
            "maximum": 30000,
            "type": "integer",
            "description": "At least 1 s; a longer robots.txt Crawl-delay wins.",
            "default": 2000
          },
          "timeoutSecs": {
            "title": "Timeout per request (s)",
            "minimum": 5,
            "maximum": 60,
            "type": "integer",
            "description": "How long to wait for one page or API response before treating it as failed (5-60 seconds).",
            "default": 20
          },
          "maxPagesPerStore": {
            "title": "Max product pages per shop (page source)",
            "minimum": 10,
            "maximum": 5000,
            "type": "integer",
            "description": "Only for shops read from product pages (one request per page, 2 s apart). Pages past the limit are not compared and never reported as removed.",
            "default": 200
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}