{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Change Tracker",
    "description": "Watches the competitor websites you choose, uses AI to explain what changed and how important it is, and sends you a plain-English digest plus instant alerts in Slack, with a permanent archive in Notion. Just paste the sites to watch — Slack and Notion are optional.",
    "version": "0.5",
    "x-build-id": "BnflOuiWK7psKlrWx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/inovaflow~website-change-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-inovaflow-website-change-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/inovaflow~website-change-tracker/runs": {
      "post": {
        "operationId": "runs-sync-inovaflow-website-change-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/inovaflow~website-change-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-inovaflow-website-change-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": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "Pages to watch",
            "type": "array",
            "description": "Required. The pages to watch, one URL per row. A root URL crawls up to 50 pages on that site; a path URL watches only that section.",
            "items": {
              "type": "string"
            }
          },
          "useCase": {
            "title": "What are you monitoring for?",
            "enum": [
              "general",
              "competitor",
              "sales",
              "news",
              "regulatory",
              "vendor",
              "jobs",
              "brand",
              "grants",
              "api"
            ],
            "type": "string",
            "description": "Tunes the AI's focus and the digest wording to your job. The engine watches every page the same way — this just picks the lens it reads changes through. Leave on General if you're not sure.",
            "default": "general"
          },
          "model": {
            "title": "AI model",
            "enum": [
              "claude-haiku-4-5-20251001",
              "claude-haiku-4-5-20251001-byok",
              "claude-sonnet-4-6",
              "claude-sonnet-4-6-byok",
              "gpt-4o-mini",
              "gpt-4o",
              "gemini-1.5-flash",
              "gemini-1.5-pro"
            ],
            "type": "string",
            "description": "Which AI writes the change summaries. The default works with zero setup.",
            "default": "claude-haiku-4-5-20251001"
          },
          "llmApiKey": {
            "title": "Your own AI API key",
            "type": "string",
            "description": "API key for GPT, Gemini, or Claude 'with your own key' models. Leave empty when using the default built-in Claude."
          },
          "customPrompt": {
            "title": "Custom write-up prompt (optional)",
            "type": "string",
            "description": "Optional. Extra instructions added ON TOP of the monitoring mode you picked above — it shapes how every AI write-up reads (each change summary and the run digest) but does NOT replace the mode, which still sets the analyst lens. Use it to fit the output to your workflow or audience. Examples: \"Turn each prospecting signal into a one-line cold-email icebreaker.\" or \"Rewrite each news item for a fintech audience.\" Leave blank to use the mode as-is.",
            "default": ""
          },
          "companyAnalysis": {
            "title": "Initial website analysis",
            "enum": [
              "never",
              "on-first-run",
              "force-now"
            ],
            "type": "string",
            "description": "Builds a one-time, reusable profile of each site from its already-captured pages. Once built, the profile is kept and fed into the AI as context on every later run, so change summaries read each change in light of what that site actually does. The profile is also saved to the dataset. Leave at Never for plain change tracking.",
            "default": "on-first-run"
          },
          "notifyThreshold": {
            "title": "Which changes to notify me about",
            "enum": [
              "all",
              "minor",
              "notable",
              "major"
            ],
            "type": "string",
            "description": "Filters what reaches Slack and email. Every change is still saved to the dataset (and archived to Notion if you've connected it) — this only controls what pings you.",
            "default": "all"
          },
          "notifyOnQuietRun": {
            "title": "Tell me even when nothing changed",
            "type": "boolean",
            "description": "Also send a short \"all clear — no changes\" note on runs that find nothing, so you know the monitor is alive. Off by default: you only hear from it when something actually changes.",
            "default": false
          },
          "outputEmail": {
            "title": "Your email address",
            "type": "string",
            "description": "Type an email address and you'll get the digest by email — the same plain-English rundown that's posted to Slack, on the same schedule, with the full report attached as a Markdown file. (Critical alerts still go to Slack only.) Sent from website-change-tracker@apify.inovaflow.app (no-reply). Leave blank to skip email."
          },
          "slackConnector": {
            "title": "Slack connector",
            "type": "string",
            "description": "Your authorized Slack MCP connector. Leave empty to skip Slack delivery. To create one: Apify Console → Settings → Integrations → MCP connectors → add https://mcp.slack.com/mcp and authorize it."
          },
          "slackChannel": {
            "title": "Slack channel",
            "type": "string",
            "description": "Slack channel or DM to post to (e.g. #competitor-watch). Leave empty to skip posting."
          },
          "notionConnector": {
            "title": "Notion connector",
            "type": "string",
            "description": "Your authorized Notion MCP connector. Leave empty to skip Notion archiving. To create one: Apify Console → Settings → Integrations → MCP connectors → add https://mcp.notion.com/mcp and authorize it."
          },
          "notionParentPage": {
            "title": "Notion page (link or ID, optional)",
            "type": "string",
            "description": "Notion page where the archive databases are created. Leave empty to create them at your workspace root."
          },
          "resetBaseline": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Wipes stored snapshots and recaptures every page fresh. This run records a new baseline but reports no changes and sends no alerts.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy used to fetch pages. Switch to Residential for sites behind Cloudflare or similar bot protection.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}