{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Screenshot & Visual Change Monitor",
    "description": "Full-page screenshots and PDFs of any website with device presets, lazy-load scrolling and cookie-banner auto-dismiss. Optionally compares every capture with the previous run and reports which pixels and regions changed.",
    "version": "0.1",
    "x-build-id": "9zryHtvW7UHucfCSN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/codeclouds~website-screenshot-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-codeclouds-website-screenshot-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/codeclouds~website-screenshot-monitor/runs": {
      "post": {
        "operationId": "runs-sync-codeclouds-website-screenshot-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/codeclouds~website-screenshot-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-codeclouds-website-screenshot-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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "URLs to capture",
            "type": "array",
            "description": "One or more absolute page URLs to capture, e.g. https://example.com. Duplicates are removed; entries that are not valid http(s) URLs come back as an error record instead of stopping the run.",
            "default": [
              "https://example.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "viewport": {
            "title": "Device preset",
            "enum": [
              "desktop",
              "laptop",
              "tablet",
              "mobile",
              "custom"
            ],
            "type": "string",
            "description": "Device viewport to render with. Use a preset for a correct mobile/tablet render, or 'custom' to set the width, height and scale yourself. The preset sizes are fixed so a screenshot taken today has the same pixel dimensions on the next run.",
            "default": "desktop"
          },
          "viewportWidth": {
            "title": "Viewport width (px) - custom preset only",
            "minimum": 240,
            "maximum": 3840,
            "type": "integer",
            "description": "Viewport width in CSS pixels. Only used when the device preset is 'custom'. Example: 1280",
            "default": 1280
          },
          "viewportHeight": {
            "title": "Viewport height (px) - custom preset only",
            "minimum": 200,
            "maximum": 3840,
            "type": "integer",
            "description": "Viewport height in CSS pixels. Only used when the device preset is 'custom'. Example: 800",
            "default": 800
          },
          "deviceScaleFactor": {
            "title": "Device pixel ratio - custom preset only",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "Pixel density for 'custom' viewports: 1 for standard, 2 for retina. Higher values produce larger files. Example: 2",
            "default": 1
          },
          "mobileUserAgent": {
            "title": "Send a mobile user agent",
            "type": "boolean",
            "description": "Use a real mobile/tablet user agent for the mobile and tablet presets, so sites serve their responsive layout. Turn off to render the mobile viewport with the desktop user agent.",
            "default": true
          },
          "fullPage": {
            "title": "Capture the full page",
            "type": "boolean",
            "description": "Capture the entire scrollable page instead of only the visible viewport. Recommended together with 'Scroll to bottom' so lazy-loaded content is included.",
            "default": true
          },
          "format": {
            "title": "Output format",
            "enum": [
              "png",
              "jpeg",
              "pdf"
            ],
            "type": "string",
            "description": "PNG for lossless screenshots and the best visual diff, JPEG for smaller files, or PDF for a printable A4 document.",
            "default": "png"
          },
          "imageQuality": {
            "title": "JPEG quality",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Compression quality for JPEG output, 1-100. Only used when the format is JPEG. Example: 80",
            "default": 80
          },
          "waitUntil": {
            "title": "Wait until",
            "enum": [
              "load",
              "domcontentloaded",
              "networkidle",
              "commit"
            ],
            "type": "string",
            "description": "When to consider the page loaded. 'networkidle' is the safest for screenshots; use 'load' for pages that keep a connection open forever (chat widgets, analytics).",
            "default": "networkidle"
          },
          "waitForSelector": {
            "title": "Wait for CSS selector",
            "type": "string",
            "description": "Wait until this element appears before capturing, e.g. '#results .product'. Leave empty to skip. Example: .pricing-table"
          },
          "waitForTimeout": {
            "title": "Extra wait (ms)",
            "minimum": 0,
            "maximum": 300000,
            "type": "integer",
            "description": "Additional fixed wait after the page is ready, in milliseconds. Use for animations or charts that need a moment. Example: 2000",
            "default": 0
          },
          "navigationTimeout": {
            "title": "Navigation timeout (ms)",
            "minimum": 1000,
            "maximum": 300000,
            "type": "integer",
            "description": "How long to wait for the page to load before recording a per-URL error. Example: 45000",
            "default": 45000
          },
          "scrollToBottom": {
            "title": "Scroll to bottom first",
            "type": "boolean",
            "description": "Scroll through the page in steps before capturing, which triggers lazy-loaded images and infinite-scroll content. Strongly recommended for full-page captures.",
            "default": true
          },
          "scrollStepDelay": {
            "title": "Delay between scroll steps (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Pause between scroll steps, giving lazy-loaded content time to appear. Example: 300",
            "default": 300
          },
          "maxScrollSteps": {
            "title": "Max scroll steps",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Safety cap for very long pages. If the cap is hit the record is still returned, with scrollTruncated set to true. Example: 40",
            "default": 40
          },
          "dismissCookieBanners": {
            "title": "Dismiss cookie banners",
            "type": "boolean",
            "description": "Click the accept button of well-known consent platforms and hide any banner that survives, in multiple languages. Only accepts, never rejects. Turn off if you want the consent dialog in the picture.",
            "default": true
          },
          "cookieBannerSelectors": {
            "title": "Extra cookie banner selectors",
            "type": "array",
            "description": "Additional CSS selectors to click, tried after the built-in consent-platform list. Example: #accept-cookies",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "clickSelectors": {
            "title": "Click before capturing",
            "type": "array",
            "description": "CSS selectors to click before the capture, e.g. a 'Show more' link, a language switcher or a tab that must be opened first. Use for elements that do not navigate away. Example: button.expand",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hideSelectors": {
            "title": "Hide elements",
            "type": "array",
            "description": "CSS selectors for elements to make invisible before the capture, e.g. cookie bars, chat widgets or sticky headers. Example: .sticky-header",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "blockTracking": {
            "title": "Block ads, analytics and chat widgets",
            "type": "boolean",
            "description": "Block requests to known ad, analytics and chat-widget hosts, and to tracking paths on the page's own host. Makes captures smaller, faster and far more stable between runs - recommended when diffing.",
            "default": true
          },
          "disableAnimations": {
            "title": "Freeze animations and video",
            "type": "boolean",
            "description": "Disable CSS animations, transitions and video/audio playback before capturing, so a carousel cannot be caught mid-frame. Recommended when diffing.",
            "default": true
          },
          "hideScrollbars": {
            "title": "Hide scrollbars",
            "type": "boolean",
            "description": "Hide browser scrollbars so they do not appear in full-page captures.",
            "default": true
          },
          "visualDiff": {
            "title": "Compare with the previous run",
            "type": "boolean",
            "description": "Compare each capture with the stored baseline of the previous run of this actor and report the percentage of changed pixels plus the regions that changed. The first run has no baseline and only stores one. This only works across separate runs: on a one-off run it just seeds the baseline.",
            "default": false
          },
          "diffThreshold": {
            "title": "Diff sensitivity",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Per-pixel colour tolerance, 0 (any difference counts) to 1 (only extreme differences count). Lower is more sensitive, which also flags more noise. Example: 0.1",
            "default": 0.1
          },
          "diffMinChangePercentage": {
            "title": "Report changed above (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Minimum share of changed pixels before a page counts as changed, in percent. Raise this to ignore rotating banners and live counters. Example: 0.5",
            "default": 0.1
          },
          "diffRegionCellSize": {
            "title": "Diff region grid size (px)",
            "minimum": 4,
            "maximum": 256,
            "type": "integer",
            "description": "Grid cell size used to group changed pixels into reported regions. A bigger grid groups small changes together. Example: 32",
            "default": 32
          },
          "diffMaxRegions": {
            "title": "Max changed regions",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many changed regions to report per page, largest first. Example: 10",
            "default": 10
          },
          "updateBaseline": {
            "title": "Update the baseline",
            "type": "boolean",
            "description": "Store this capture as the new baseline after comparing. Turn off to compare against a fixed reference without moving the goalposts.",
            "default": true
          },
          "maxPages": {
            "title": "Max URLs per run",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Stop after this many URLs. Extra URLs are dropped and the run logs a warning. Example: 20",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy settings, e.g. {\"useApifyProxy\": true, \"apifyProxyGroups\": [\"RESIDENTIAL\"], \"apifyProxyCountry\": \"NL\"}. Leave empty to connect directly."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}