rendex-dev · Schema

UpdateWatchRequest

All fields optional. `webhookUrl` and `notifyEmail` additionally accept `null` to clear a channel. Set `paused` true to pause, false to resume. Validated with a STRICT schema — any unknown field is REJECTED with a 400 VALIDATION_ERROR, not silently ignored. `renderParams` is MERGED over the watch's existing render config: send only the knobs you want to change. A scope-changing renderParams edit (e.g. `selector`, `fullPage`, `width`/`height`, `device`) re-baselines on the next run, the same way a `url` change does.

RenderingScreenshotPDFAPIAutomation

Properties

Name Type Description
url string
name string
intervalMinutes integer
diffMode string
threshold number
renderParams object
aiSummary boolean
webhookUrl string
notifyEmail string
paused boolean
View JSON Schema on GitHub

JSON Schema

rendex-dev-update-watch-request-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/rendex-dev/json-schema/rendex-dev-update-watch-request-schema.json",
  "title": "UpdateWatchRequest",
  "description": "All fields optional. `webhookUrl` and `notifyEmail` additionally accept `null` to clear a\nchannel. Set `paused` true to pause, false to resume. Validated with a STRICT schema — any\nunknown field is REJECTED with a 400 VALIDATION_ERROR, not silently ignored.\n\n`renderParams` is MERGED over the watch's existing render config: send only the knobs you\nwant to change. A scope-changing renderParams edit (e.g. `selector`, `fullPage`,\n`width`/`height`, `device`) re-baselines on the next run, the same way a `url` change does.\n",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/rendex-dev-openapi.yaml#/components/schemas/UpdateWatchRequest",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "name": {
      "type": "string",
      "maxLength": 120
    },
    "intervalMinutes": {
      "type": "integer",
      "minimum": 5,
      "maximum": 43200
    },
    "diffMode": {
      "type": "string",
      "enum": [
        "visual",
        "text",
        "both"
      ]
    },
    "threshold": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "renderParams": {
      "$ref": "#/$defs/WatchRenderParams"
    },
    "aiSummary": {
      "type": "boolean"
    },
    "webhookUrl": {
      "type": "string",
      "format": "uri"
    },
    "notifyEmail": {
      "type": "string",
      "format": "email"
    },
    "paused": {
      "type": "boolean"
    }
  },
  "$defs": {
    "WatchRenderParams": {
      "type": "object",
      "additionalProperties": false,
      "description": "Render knobs applied on every check — a subset of the screenshot capture params, stored on\nthe watch and fed to the renderer each run. Inline source params (`url`/`html`/`markdown`/\n`data`) and credential knobs (`cookies`/`headers`/`css`/`js`) are NOT accepted here; the\nwatch's target is the top-level `url`. Validated with a STRICT schema: any capture param\noutside the list below (e.g. `quality`, `css`, `js`, `resize*`, `pdf*`, `userAgent`,\n`cookies`, `headers`) is REJECTED with a 400 VALIDATION_ERROR — extras are NOT silently ignored.\n",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "png",
            "jpeg",
            "webp",
            "pdf"
          ],
          "default": "png",
          "description": "A pdf cannot be visually diffed — pair it with diffMode `text`."
        },
        "width": {
          "type": "integer",
          "minimum": 320,
          "maximum": 3840,
          "default": 1280
        },
        "height": {
          "type": "integer",
          "minimum": 240,
          "maximum": 2160,
          "default": 800
        },
        "fullPage": {
          "type": "boolean",
          "default": true,
          "description": "Defaults to true for watches (overrides the screenshot default of false) so the whole\npage is monitored — a viewport-only capture would miss changes below the fold. Set false\n(or use a selector) to scope down on purpose.\n"
        },
        "device": {
          "type": "string",
          "enum": [
            "desktop",
            "iphone_15",
            "iphone_se",
            "pixel_8",
            "ipad",
            "ipad_pro"
          ]
        },
        "deviceScaleFactor": {
          "type": "number",
          "minimum": 1,
          "maximum": 3,
          "default": 2
        },
        "darkMode": {
          "type": "boolean",
          "default": false
        },
        "blockAds": {
          "type": "boolean",
          "default": true
        },
        "blockCookieBanners": {
          "type": "boolean",
          "default": false
        },
        "hideSelectors": {
          "type": "array",
          "maxItems": 50,
          "items": {
            "type": "string",
            "maxLength": 500
          },
          "description": "Remove these elements before capture"
        },
        "waitUntil": {
          "type": "string",
          "enum": [
            "load",
            "domcontentloaded",
            "networkidle0",
            "networkidle2"
          ],
          "default": "networkidle2"
        },
        "delay": {
          "type": "integer",
          "minimum": 0,
          "maximum": 10000,
          "default": 0,
          "description": "Extra wait in milliseconds after the page is ready"
        },
        "timeout": {
          "type": "integer",
          "minimum": 5,
          "maximum": 60,
          "default": 30,
          "description": "Navigation timeout in seconds"
        },
        "geo": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "Pro+ — 2-letter ISO 3166-1 alpha-2 country code (e.g. `US`, `GB`; case-insensitive, upper-cased server-side) to render from. Cannot be combined with a text diffMode."
        },
        "geoCity": {
          "type": "string"
        },
        "geoState": {
          "type": "string"
        },
        "selector": {
          "type": "string",
          "maxLength": 500,
          "description": "Capture and diff ONLY this CSS element — watch just one price, banner, or section\ninstead of the whole page. Visual-first (in text mode the extracted text is full-page).\n"
        },
        "ignoreRegions": {
          "type": "array",
          "maxItems": 20,
          "description": "Pixel rectangles masked in BOTH captures before the visual diff — silence dynamic zones\n(an ad slot, a clock) so they never trip a change. Visual mode only.\n",
          "items": {
            "type": "object",
            "required": [
              "x",
              "y",
              "width",
              "height"
            ],
            "properties": {
              "x": {
                "type": "number",
                "minimum": 0
              },
              "y": {
                "type": "number",
                "minimum": 0
              },
              "width": {
                "type": "number",
                "exclusiveMinimum": 0,
                "description": "Pixels (> 0)"
              },
              "height": {
                "type": "number",
                "exclusiveMinimum": 0,
                "description": "Pixels (> 0)"
              }
            }
          }
        },
        "ignoreText": {
          "type": "array",
          "maxItems": 50,
          "items": {
            "type": "string",
            "maxLength": 500
          },
          "description": "Substrings or `/regex/flags` patterns stripped from BOTH texts before the text diff —\nsilence boilerplate (timestamps, view counts, session tokens). Applies to text/both modes.\n"
        },
        "minTextChars": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100000,
          "description": "Minimum added + removed characters for a text change to count — ignore tiny edits below\nthe size you care about.\n"
        },
        "suppressWhilePresent": {
          "type": "array",
          "maxItems": 20,
          "items": {
            "type": "string",
            "maxLength": 500
          },
          "description": "While the page text contains any of these markers (e.g. \"Out of stock\", \"Loading\"), the\nrun is treated as unchanged — no alert, no baseline drift — until the marker clears.\n"
        },
        "uaMode": {
          "type": "string",
          "enum": [
            "auto",
            "identify",
            "stealth"
          ],
          "default": "auto",
          "description": "How the monitor presents its User-Agent. `auto` (default) identifies as RendexWatch and\nretries once with a standard browser identity if the page looks blocked; `identify`\nalways identifies as RendexWatch and never falls back; `stealth` always presents a\nstandard browser identity. See https://rendex.dev/bot.\n"
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/rendex-dev-update-watch-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.