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.
Properties
| Name | Type | Description |
|---|---|---|
| url | string | |
| name | string | |
| intervalMinutes | integer | |
| diffMode | string | |
| threshold | number | |
| renderParams | object | |
| aiSummary | boolean | |
| webhookUrl | string | |
| notifyEmail | string | |
| paused | boolean |
JSON Schema
{
"$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.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/rendex-dev-update-watch-request"
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.