{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Change Monitor: Diff, Price & Stock, $3/1K",
    "description": "Website change monitor for public pages. Each URL is one check that returns a text diff, the changed CSS selector, price and stock status. Respects robots.txt. $0.003 per URL. Schedule it for alerts.",
    "version": "1.0",
    "x-build-id": "q1FHMgHedZYbpfNcJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/conserving_celerytop~website-change-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-conserving_celerytop-website-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/conserving_celerytop~website-change-monitor/runs": {
      "post": {
        "operationId": "runs-sync-conserving_celerytop-website-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/conserving_celerytop~website-change-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-conserving_celerytop-website-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",
        "properties": {
          "startUrls": {
            "title": "Page URLs",
            "type": "array",
            "description": "Add the public URLs to check: web pages, RSS or Atom feeds, or JSON API endpoints, depending on Source type. Each URL is one source. The first check stores a baseline, later checks return what changed. Up to 500 URLs per run.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sourceType": {
            "title": "Source type",
            "enum": [
              "page",
              "feed",
              "json"
            ],
            "type": "string",
            "description": "Choose what the URLs are. Page compares page text, a selector, price and stock. Feed returns only the new or changed items of an RSS or Atom feed. JSON returns only the new or changed records of a JSON response. All URLs of one run use the same type.",
            "default": "page"
          },
          "idField": {
            "title": "ID field (JSON only)",
            "type": "string",
            "description": "For Source type JSON: the field that identifies one record, for example recall_number or id. A dot path such as meta.id also works. Leave it empty to compare the whole document instead and get a line diff."
          },
          "itemsPath": {
            "title": "Items path (JSON only)",
            "type": "string",
            "description": "For Source type JSON with an ID field: the path to the list of records, for example results or data.items. Leave it empty to find the list automatically (a top-level list, or a field named results, items, data or records)."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "Optional. After the run, the Actor sends one POST with a JSON body that holds only the changes. Nothing is sent when nothing changed. Only https URLs are accepted, private and internal addresses are refused. A failed webhook does not fail the run and is listed as a status row in the results."
          },
          "selector": {
            "title": "CSS selector",
            "type": "string",
            "description": "Enter a CSS selector to watch one part of the page, for example main h1 or #offers. The diff then covers only that part, so changes elsewhere on the page are ignored."
          },
          "priceSelector": {
            "title": "Price selector",
            "type": "string",
            "description": "Enter the CSS selector of the element that shows the price, for example .product-price. Pages with product data in JSON-LD or meta tags are read automatically. Prices are returned as a number, a currency and cents."
          },
          "stockSelector": {
            "title": "Stock selector",
            "type": "string",
            "description": "Enter the CSS selector of the element that shows the stock status, for example .availability. The text is returned as in_stock, out_of_stock, preorder or backorder."
          },
          "priceBelow": {
            "title": "Target price",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "number",
            "description": "Enter the price you want to be told about. The result row shows priceTargetMet as true when the current price is at or below this number."
          },
          "monitorName": {
            "title": "Monitor name",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9-]{0,29}$",
            "type": "string",
            "description": "Name the watchlist that keeps your baselines. Use letters, numbers and hyphens, for example price-watch. Runs with the same name compare against each other, runs with different names keep separate baselines.",
            "default": "default"
          },
          "ignoreSelectors": {
            "title": "Ignored elements",
            "type": "array",
            "description": "Add CSS selectors of page parts to remove before comparing, for example .cookie-banner or #live-clock. Use this for banners, counters and ads that change on every visit.",
            "items": {
              "type": "string"
            }
          },
          "ignorePatterns": {
            "title": "Ignored text patterns",
            "type": "array",
            "description": "Add regular expressions for text to remove from every line before comparing, for example Updated on .* or \\d+ visitors. Matching ignores letter case.",
            "items": {
              "type": "string"
            }
          },
          "maxDiffLines": {
            "title": "Maximum diff lines",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Set how many changed lines (pages and whole JSON documents) or changed items (feeds and JSON records) one result row lists. The counts always show the full size of the change.",
            "default": 50
          },
          "maxUrls": {
            "title": "Maximum URLs",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Set how many URLs one run checks. Extra URLs are skipped and cost nothing.",
            "default": 100
          },
          "resetBaseline": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Select this to store the current state of every URL as the new baseline. The run returns the status baseline for each URL instead of a diff.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}