{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Screenshots: Full Page, Mobile, PDF & Change Alerts",
    "description": "Screenshot any list of URLs (full page or viewport, desktop or mobile, PNG, JPEG or PDF, one element, no cookie banners), or schedule it to compare each page with the last run and get how much it changed, with the changed area and a Slack-ready summary.",
    "version": "0.1",
    "x-build-id": "94hQcpvoErQpTOwx4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rookdev~website-screenshot-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rookdev-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/rookdev~website-screenshot-monitor/runs": {
      "post": {
        "operationId": "runs-sync-rookdev-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/rookdev~website-screenshot-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-rookdev-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": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "URLs to capture",
            "minItems": 1,
            "type": "array",
            "description": "One page per line, for example https://apify.com/pricing. Add a name for alerts with \"Name | URL\", for example \"Competitor pricing | https://example.com/pricing\". Only public pages: pages that ask for a password are never captured. At most 5,000 per run; split longer lists across runs or tasks.",
            "items": {
              "type": "string"
            }
          },
          "fullPage": {
            "title": "Full page",
            "type": "boolean",
            "description": "Capture the whole page from top to bottom (up to the max page height). Turn off to capture only what fits in the window (the viewport).",
            "default": true
          },
          "device": {
            "title": "Device",
            "enum": [
              "desktop",
              "mobile",
              "tablet"
            ],
            "type": "string",
            "description": "Desktop is a 1280 x 800 window. Mobile is a 412 x 915 phone screen and tablet an 800 x 1280 one, both at 2x pixel density with touch, so sites show their mobile layout.",
            "default": "desktop"
          },
          "viewportWidth": {
            "title": "Window width (px)",
            "minimum": 200,
            "maximum": 3840,
            "type": "integer",
            "description": "Optional. Overrides the device's window width, for example 1440 or 1920. Leave empty to use the device preset."
          },
          "viewportHeight": {
            "title": "Window height (px)",
            "minimum": 200,
            "maximum": 4320,
            "type": "integer",
            "description": "Optional. Overrides the device's window height. With Full page off, this is the height of the screenshot, for example 600 for just the top of the page."
          },
          "format": {
            "title": "Image format",
            "enum": [
              "png",
              "jpeg"
            ],
            "type": "string",
            "description": "PNG is pixel-exact (best for monitoring and text). JPEG files are several times smaller (good for archives and thumbnails). For a PDF, turn on \"Also save a PDF\".",
            "default": "png"
          },
          "jpegQuality": {
            "title": "JPEG quality",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "JPEG only: 1 (smallest file) to 100 (best quality).",
            "default": 80
          },
          "savePdf": {
            "title": "Also save a PDF",
            "type": "boolean",
            "description": "Also save each page as an A4 PDF with backgrounds, linked in pdfUrl. Included in the screenshot price.",
            "default": false
          },
          "selector": {
            "title": "Capture one element (CSS selector)",
            "type": "string",
            "description": "Optional. Capture only the first element matching this CSS selector instead of the page, for example #pricing or .plans. When monitoring, changes are measured on that element only, which makes small changes (a price) show up clearly."
          },
          "hideCookieBanners": {
            "title": "Hide cookie banners and chat widgets",
            "type": "boolean",
            "description": "Hide consent banners (OneTrust, Cookiebot, Didomi, Usercentrics and about 20 more consent tools, plus unknown banners found by their wording) and chat launchers (Intercom, Drift, HubSpot, Zendesk and more). Nothing is clicked or accepted: they are only hidden.",
            "default": true
          },
          "hideSelectors": {
            "title": "Hide these elements",
            "type": "array",
            "description": "CSS selectors of elements to hide, one per line, for example .ad-slot or #rotating-banner. Their space is kept, so the layout does not move. Use it to keep rotating content out of change monitoring.",
            "items": {
              "type": "string"
            }
          },
          "waitForSelector": {
            "title": "Wait for element (CSS selector)",
            "type": "string",
            "description": "Optional. Wait until this element is visible before capturing, for example .price-table. If it never appears within the page timeout, you get a free row explaining that and no charge."
          },
          "delayMs": {
            "title": "Extra delay before capture (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Wait this long after the page has loaded (and lazy content was scrolled in) before capturing, for animations or late widgets. 0 for none, at most 10 seconds; it counts inside the page timeout.",
            "default": 0
          },
          "scrollToLoadLazyContent": {
            "title": "Scroll to load lazy images",
            "type": "boolean",
            "description": "Scroll down the page (for at most 6 seconds, up to the max page height) and back up before a full-page capture, so lazy-loaded images and scroll animations appear.",
            "default": true
          },
          "darkMode": {
            "title": "Dark mode",
            "type": "boolean",
            "description": "Ask the page for its dark theme (prefers-color-scheme: dark). Pages without a dark theme look the same.",
            "default": false
          },
          "maxPageHeight": {
            "title": "Max page height (px)",
            "minimum": 500,
            "maximum": 16000,
            "type": "integer",
            "description": "Full-page captures stop at this height, so endless pages cannot run up time and memory, and the row says so (truncated). Captures are also kept under 16,000 image pixels tall and 16 megapixels in all, so mobile stops at 8,000 px, tablet at 5,000 px and a 3,840 px wide window at about 4,100 px.",
            "default": 10000
          },
          "pageTimeoutSecs": {
            "title": "Page timeout (seconds)",
            "minimum": 10,
            "maximum": 60,
            "type": "integer",
            "description": "How long a page may take to load, including waiting for your element and the extra delay. A page that is still not ready gets a free error row and is not charged. At most 60 seconds, so one page never takes more than about 90 seconds.",
            "default": 45
          },
          "compareWithPreviousRun": {
            "title": "Compare with the previous run (monitor changes)",
            "type": "boolean",
            "description": "Turn on, save as a task and schedule it: each page is compared with its last screenshot, and you get the share of pixels that changed, the changed area, a link to the previous screenshot and an image with the changes in red. The first run saves each page as its baseline. Normal runs never touch this memory.",
            "default": false
          },
          "minChangePercent": {
            "title": "Smallest change to report",
            "enum": [
              "0",
              "0.1",
              "0.5",
              "1",
              "5",
              "10",
              "25"
            ],
            "type": "string",
            "description": "A page counts as changed when at least this share of its pixels changed (a pixel counts when a colour moved by more than 24 of 255, so font smoothing does not). The default 0.1% catches a changed paragraph or banner on a full page; for a price, capture the price element (then the share is of that element) or pick 'Any visible change'. Raise it, or use \"Hide these elements\", for pages with carousels, dates or ads.",
            "default": "0.1"
          },
          "onlyChangedPages": {
            "title": "Only return pages that changed",
            "type": "boolean",
            "description": "Monitoring only: pages that did not change get no row and no screenshot charge (only the comparison), so your dataset, sheet or Zapier flow holds changes only.",
            "default": false
          },
          "skipExistingOnFirstRun": {
            "title": "Start quietly: first run only saves baselines",
            "type": "boolean",
            "description": "Monitoring only: the first run saves each page's baseline without returning rows (each baseline is charged as one comparison instead of a screenshot), so alerts start with the first real change.",
            "default": false
          },
          "stateStoreName": {
            "title": "Monitoring memory name",
            "pattern": "^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$",
            "maxLength": 63,
            "type": "string",
            "description": "Key-value store that keeps each page's last screenshot between runs (lowercase letters, digits and hyphens). Each saved task and each set of capture options keeps its own memory inside it, so the default works for most people.",
            "default": "website-screenshot-monitor-state"
          },
          "maxConcurrency": {
            "title": "Pages captured in parallel",
            "minimum": 1,
            "maximum": 4,
            "type": "integer",
            "description": "How many pages the browser opens at the same time, at most 4. 3 suits the default 2 GB of memory.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}