rendex-dev · Schema
WatchRun
One execution of a watch. Image URLs are short-lived signed links and may 404 for runs older than the bucket lifecycle.
RenderingScreenshotPDFAPIAutomation
Properties
| Name | Type | Description |
|---|---|---|
| id | string | |
| watchId | string | |
| status | string | |
| changed | boolean | Null until the run completes |
| diffScore | number | 0..1 fraction of the page that changed; null for text-only or failed runs |
| diffPixels | integer | |
| beforeUrl | string | Signed "before" baseline capture |
| afterUrl | string | Signed "after" capture |
| diffOverlayUrl | string | Signed highlighted overlay |
| cropUrl | stringnull | Signed image cropped tight to the change ("what changed") — post straight into Slack/a ticket. Null when the run had no discrete visual region (dimensions-only or text-only change). |
| changedRegion | object | Normalized (0..1) union box of the changed regions. Null when there is no discrete region. |
| aiSummary | stringnull | One-line plain-English "what changed" summary (Pro+; AI from the text diff, or a templated line from the changed region for visual-only changes). Same value the watch.changed webhook `summary` field c |
| textDiff | object | Present for text/both runs; null otherwise |
| creditsCharged | integer | Net credits charged for this run (0 after a refund or for the demo account) |
| error | string | Free-text failure reason when status is failed |
| errorCode | string | Structured failure reason; null until/unless the run fails. Branch on this instead of parsing error. |
| createdAt | string | |
| completedAt | string |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/rendex-dev/json-schema/rendex-dev-watch-run-schema.json",
"title": "WatchRun",
"description": "One execution of a watch. Image URLs are short-lived signed links and may 404 for runs older than the bucket lifecycle.",
"x-generated": "2026-10-31",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/rendex-dev-openapi.yaml#/components/schemas/WatchRun",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"watchId": {
"type": "string",
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"queued",
"processing",
"completed",
"failed"
]
},
"changed": {
"type": "boolean",
"description": "Null until the run completes"
},
"diffScore": {
"type": "number",
"description": "0..1 fraction of the page that changed; null for text-only or failed runs"
},
"diffPixels": {
"type": "integer"
},
"beforeUrl": {
"type": "string",
"format": "uri",
"description": "Signed \"before\" baseline capture"
},
"afterUrl": {
"type": "string",
"format": "uri",
"description": "Signed \"after\" capture"
},
"diffOverlayUrl": {
"type": "string",
"format": "uri",
"description": "Signed highlighted overlay"
},
"cropUrl": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "Signed image cropped tight to the change (\"what changed\") — post straight into Slack/a ticket. Null when the run had no discrete visual region (dimensions-only or text-only change)."
},
"changedRegion": {
"allOf": [
{
"$ref": "#/$defs/WatchChangedRegion"
}
],
"nullable": true,
"description": "Normalized (0..1) union box of the changed regions. Null when there is no discrete region."
},
"aiSummary": {
"type": [
"string",
"null"
],
"description": "One-line plain-English \"what changed\" summary (Pro+; AI from the text diff, or a templated line from the changed region for visual-only changes). Same value the watch.changed webhook `summary` field carries. Null when unavailable."
},
"textDiff": {
"type": "object",
"description": "Present for text/both runs; null otherwise",
"properties": {
"added": {
"type": "array",
"items": {
"type": "string"
}
},
"removed": {
"type": "array",
"items": {
"type": "string"
}
},
"summary": {
"type": "string"
}
}
},
"creditsCharged": {
"type": "integer",
"description": "Net credits charged for this run (0 after a refund or for the demo account)"
},
"error": {
"type": "string",
"description": "Free-text failure reason when status is failed"
},
"errorCode": {
"type": "string",
"enum": [
"blocked",
"timeout",
"selector",
"http_error",
"network",
"storage",
"unknown"
],
"description": "Structured failure reason; null until/unless the run fails. Branch on this instead of parsing error."
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time"
}
},
"$defs": {
"WatchChangedRegion": {
"type": "object",
"description": "Normalized (0..1) union bounding box of all changed regions on the page — the \"where\" of a visual change. Multiply by the capture's dimensions to get pixels; use it to crop or annotate in your own tooling.",
"properties": {
"x": {
"type": "number",
"description": "Left edge as a fraction of page width (0..1)."
},
"y": {
"type": "number",
"description": "Top edge as a fraction of page height (0..1)."
},
"width": {
"type": "number",
"description": "Width as a fraction of page width (0..1)."
},
"height": {
"type": "number",
"description": "Height as a fraction of page height (0..1)."
}
}
}
}
}
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
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/rendex-dev-watch-run"
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.