
Website monitoring: uptime, checkout, SEO (Search Console, Bing), security, speed, DNS, compliance.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. Your Relvato API key as a Bearer token, from API access (app.relvato.com/api-access). Leave it out to sign in with OAuth instead.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
The structure monitor found a page whose layout changed on purpose: adopt this run's structure as the new baseline for that page (pageKey), or for every changed page on the run (all: true). Undo with undo_structure_review.
The structure monitor's run
Every changed page on the run
The page (get_run metrics.pages[].pageKey)
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
The structure monitor found a page whose layout changed on purpose: adopt this run's structure as the new baseline for that page (pageKey), or for every changed page on the run (all: true). Undo with undo_structure_review.
| Argument | Type | Description |
|---|---|---|
| all | boolean | Every changed page on the run |
| runId* | string | The structure monitor's run |
| pageKey | string | The page (get_run metrics.pages[].pageKey) |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"all": {
"type": "boolean",
"description": "Every changed page on the run"
},
"runId": {
"type": "string",
"description": "The structure monitor's run"
},
"pageKey": {
"type": "string",
"description": "The page (get_run metrics.pages[].pageKey)"
}
},
"additionalProperties": false
}The visual monitor found a page that changed on purpose (a redesign, new content): make this run's screenshot the new baseline for that page, device and browser. Undo with undo_visual_review. Only when the user confirms the change is intended.
| Argument | Type | Description |
|---|---|---|
| comparisonId* | string | From get_run visualComparisons[].comparisonId |
{
"type": "object",
"required": [
"comparisonId"
],
"properties": {
"comparisonId": {
"type": "string",
"description": "From get_run visualComparisons[].comparisonId"
}
},
"additionalProperties": false
}Add monitors to a site by key (from list_checks). Each key reports added / exists / rejected with the reason (plan, active-monitor limit, needs the WordPress plugin). Once the site's ownership is proven, new monitors get a daily schedule on plans that run daily (Pro and up) and a weekly one on Free, plus a re-run when the site changes on Pro and up (WordPress plugin updates, or pushes via the GitHub App). Before proof they're added but only run when trigger_scan starts them (scheduleStarts).
| Argument | Type | Description |
|---|---|---|
| keys* | array | Check keys, e.g. ["uptime", "ssl", "error-scan"] |
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId",
"keys"
],
"properties": {
"keys": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 30,
"minItems": 1,
"description": "Check keys, e.g. [\"uptime\", \"ssl\", \"error-scan\"]"
},
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Describe in plain words what to verify on a page (e.g. "the Pro plan shows a price", "search for 'shoes' returns results") and Relvato's AI writes a monitor for it, in a minute or two. Follow it with get_check: status goes authoring → proposed (show the user its rationale and steps, then approve_custom_check) or needs-input (answer with reauthor_custom_check) or failed (with advice). Read-only by default; interactive: true lets it click and type (search, filters, forms). Plan-gated; counts toward the active-monitor limit.
| Argument | Type | Description |
|---|---|---|
| url* | string | The page to check: a full URL on the site |
| goal* | string | What must be true on that page, in plain words |
| name | string | A name for the monitor (defaults to the goal) |
| siteId* | string | The site id |
| interactive | boolean | Allow clicking and typing on the live page |
| authenticated | boolean | WordPress sites: run logged in as Relvato's verification user |
{
"type": "object",
"required": [
"siteId",
"url",
"goal"
],
"properties": {
"url": {
"type": "string",
"description": "The page to check: a full URL on the site"
},
"goal": {
"type": "string",
"description": "What must be true on that page, in plain words"
},
"name": {
"type": "string",
"description": "A name for the monitor (defaults to the goal)"
},
"siteId": {
"type": "string",
"description": "The site id"
},
"interactive": {
"type": "boolean",
"description": "Allow clicking and typing on the live page"
},
"authenticated": {
"type": "boolean",
"description": "WordPress sites: run logged in as Relvato's verification user"
}
},
"additionalProperties": false
}Create a heartbeat for a job the user runs (cron job, backup script, scheduled task, CI job). Returns its ping URL: the job requests it when it succeeds (e.g. `your-job && curl -fsS -m 10 --retry 3 <pingUrl>`), and `<pingUrl>/fail` to report a failure (a POST body is kept with the ping). No ping within period + grace, or a failure, alerts the user at once; a new heartbeat waits for its first ping and never alerts before it. Adds the site's Heartbeats monitor with the first one. Plan limits per account: Free 2, Pro 20, Business 100, Agency 500.
| Argument | Type | Description |
|---|---|---|
| tz | string | The cron expression's IANA time zone, e.g. Europe/Bucharest (default UTC) |
| cron | string | Instead of a period: the job's cron expression (five fields, e.g. "0 3 * * *" or "*/15 * * * 1-5"; @daily, @hourly … work too). A ping is then due by each time it fires plus the grace |
| name* | string | What the job is, e.g. "Nightly backup" |
| siteId* | string | The site's id |
| graceSec | number | How late a ping may be before it counts as missed, in seconds (60 to 604800 = 7 days; default 3600) |
| periodSec | number | How often the job runs, in seconds (60 to 2678400 = 31 days; default 86400 = daily). Ignored when `cron` is set |
Start monitoring a website. Returns the site and its setup: until the owner proves ownership (connect the WordPress plugin, or verify the domain — the only option for non-WordPress sites), trigger_scan can run the public monitors by hand 3 times a day (setup.manualRuns); scheduled runs, alerts, update/deploy runs and the monitors that act on the site need the proof (setup.nextStep); setup.afterProof says what proof adds for this site on its plan. If the account already has a site on the same domain, that site is returned instead of a duplicate. How ownership is proven: https://www.relvato.com/docs/verify-site-ownership
| Argument | Type | Description |
|---|---|---|
| url* | string | The site's address, e.g. https://example.com |
| name | string | Display name (defaults to the domain) |
| platform* | string | "wordpress" for WordPress/WooCommerce (deepest monitors via the Relvato plugin); "other" for any other site or AI-built app (public-page monitors, domain verification). |
{
"type": "object",
"required": [
"url",
"platform"
],
"properties": {
"url": {
"type": "string",
"description": "The site's address, e.g. https://example.com"
},
"name": {
"type": "string",
"description": "Display name (defaults to the domain)"
},
"platform": {
"enum": [
"wordpress",
"other"
],
"type": "string",
"description": "\"wordpress\" for WordPress/WooCommerce (deepest monitors via the Relvato plugin); \"other\" for any other site or AI-built app (public-page monitors, domain verification)."
}
},
"additionalProperties": false
}WordPress sites: apply the one-click fix a run proposes (get_run proposedFix: e.g. clear a stuck maintenance file, turn indexing back on, roll back the plugin update that broke it) through the Relvato plugin, then re-run the monitor to confirm. Only that exact fix can be applied. Tell the user what it changes (proposedFix.why and undo) and get their go-ahead first. undo: true reverts the last fix applied on the site. With Relvato plugin 1.77.0+ Relvato never changes the site remotely: the answer is applyInWordPress, a link where an administrator applies it in WordPress — give it to the user.
| Argument | Type | Description |
|---|---|---|
| undo | boolean | Revert the last fix applied on this site instead |
| runId* | string | The run that proposes the fix |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"undo": {
"type": "boolean",
"description": "Revert the last fix applied on this site instead"
},
"runId": {
"type": "string",
"description": "The run that proposes the fix"
}
},
"additionalProperties": false
}Approve a custom monitor's proposed recipe (status proposed) so it runs and alerts from now on. Show the user its rationale and steps first (get_check). A recipe in interactive mode clicks or types on the live site: approve it only after the user agrees, with ack: true.
| Argument | Type | Description |
|---|---|---|
| ack | boolean | Required for an interactive recipe: the user agreed it may act on the live site |
| checkId* | string | The custom monitor's id |
{
"type": "object",
"required": [
"checkId"
],
"properties": {
"ack": {
"type": "boolean",
"description": "Required for an interactive recipe: the user agreed it may act on the live site"
},
"checkId": {
"type": "string",
"description": "The custom monitor's id"
}
},
"additionalProperties": false
}Relvato AI triage (a site on level "aside") set this failed run aside as likely noise — get_run shows aiTriage.setAside. Make it count as a failure again: in the bell, the digest and site health. No alert is re-sent. Use it when the user says the failure is real.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The set-aside run |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"runId": {
"type": "string",
"description": "The set-aside run"
}
},
"additionalProperties": false
}WordPress / WooCommerce: have Relvato read the store again (a product to buy, checkout type, guest checkout, currency) after the store changed. Runs in the background.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Stop a site's runs that are queued but haven't started (after a big trigger_scan, or before maintenance). Cancelled runs can't be brought back: start them again with trigger_scan. The run that's already going finishes; nothing already recorded is deleted. Get the user's go-ahead first.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Stop recommending a monitor for a site (list_checks marks recommendations), or bring every dismissed recommendation back with restoreAll.
| Argument | Type | Description |
|---|---|---|
| key | string | The monitor key to stop recommending |
| siteId* | string | The site id |
| restoreAll | boolean | true: bring back every recommendation dismissed on this site (key not needed) |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"key": {
"type": "string",
"description": "The monitor key to stop recommending"
},
"siteId": {
"type": "string",
"description": "The site id"
},
"restoreAll": {
"type": "boolean",
"description": "true: bring back every recommendation dismissed on this site (key not needed)"
}
},
"additionalProperties": false
}Give a custom monitor a new goal, page, name or mode. Its current recipe is dropped and the AI writes a new one, which needs approving again before the monitor runs.
| Argument | Type | Description |
|---|---|---|
| url* | string | The page to check: a full URL on the site |
| goal* | string | What must be true on that page |
| name | string | A new name |
| checkId* | string | The custom monitor's id |
| interactive | boolean | Allow clicking and typing on the live page (search, filters, forms) |
| authenticated | boolean | WordPress sites: run logged in as Relvato's verification user |
{
"type": "object",
"required": [
"checkId",
"url",
"goal"
],
"properties": {
"url": {
"type": "string",
"description": "The page to check: a full URL on the site"
},
"goal": {
"type": "string",
"description": "What must be true on that page"
},
"name": {
"type": "string",
"description": "A new name"
},
"checkId": {
"type": "string",
"description": "The custom monitor's id"
},
"interactive": {
"type": "boolean",
"description": "Allow clicking and typing on the live page (search, filters, forms)"
},
"authenticated": {
"type": "boolean",
"description": "WordPress sites: run logged in as Relvato's verification user"
}
},
"additionalProperties": false
}Keep quarantine mode on for another 48 hours from now.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}The AI review let a visual change pass, but it's actually broken: mark it a failure. The run counts as failed in Relvato and shows as needing attention (notifications, Monitors passing); no message is sent.
| Argument | Type | Description |
|---|---|---|
| comparisonId* | string | From get_run visualComparisons[].comparisonId |
{
"type": "object",
"required": [
"comparisonId"
],
"properties": {
"comparisonId": {
"type": "string",
"description": "From get_run visualComparisons[].comparisonId"
}
},
"additionalProperties": false
}WordPress sites: who did what — sign-ins and failed sign-ins (with the network, not the full address), accounts and roles, application passwords, plugin / theme / core updates, setting and file edits, PHP errors and failed emails — newest first, within the plan's history (7 to 365 days).
| Argument | Type | Description |
|---|---|---|
| days | number | How far back (up to the plan's history) |
| limit | number | Max events, 1-300 (default 100) |
| filter | string | logins = sign-ins and failed sign-ins; people = roles, deleted accounts, application passwords; changes = plugin / theme / core updates, settings and file edits; errors = PHP errors and failed emails; all (default) = everything |
| search | string | Only events mentioning this (a username, a plugin) |
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"days": {
"type": "number",
"description": "How far back (up to the plan's history)"
},
"limit": {
"type": "number",
"description": "Max events, 1-300 (default 100)"
},
"filter": {
"enum": [
"all",
"logins",
"people",
"changes",
"errors"
],
"type": "string",
"description": "logins = sign-ins and failed sign-ins; people = roles, deleted accounts, application passwords; changes = plugin / theme / core updates, settings and file edits; errors = PHP errors and failed emails; all (default) = everything"
},
"search": {
"type": "string",
"description": "Only events mentioning this (a username, a plugin)"
},
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Who is told about what: how often (instant, daily / weekly digest), the minimum severity, each channel (email, Slack, webhook — whether the plan includes it, whether it's set up, paused, and `on` = alerts actually go out on it), which sites are muted and which monitor types go to which channel (only channels that are on). Never includes webhook URLs or secrets. Changing them is done by the user in Alert settings.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}One monitor in full: on/off, when it runs (schedule, time zone, re-runs on WordPress updates, random extra runs, and whether the plan allows them), its own settings (the visual monitor's pages with their keys, masks, devices, browsers and threshold; the checkout's product, coupon, shipping and field answers; extra pages to scan; …), which settings sections update_check_settings accepts for it, the findings the user ignored, an AI-authored monitor's goal, status, question and recipe steps, and its latest run.
| Argument | Type | Description |
|---|---|---|
| checkId* | string | The monitor's id (from site_overview or add_checks) |
{
"type": "object",
"required": [
"checkId"
],
"properties": {
"checkId": {
"type": "string",
"description": "The monitor's id (from site_overview or add_checks)"
}
},
"additionalProperties": false
}For a run that failed or found a problem: the same brief Relvato's own AI answers when the user clicks "Suggest a fix" — the site's detected stack, what the monitor verifies, what changed on the site just before, the exact error and findings, whether it was already failing earlier, and for Google / Bing Search the evidence that rules causes out. Use it as context to explain the likely cause and fixes; applying a fix stays with the user.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The run id |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"runId": {
"type": "string",
"description": "The run id"
}
},
"additionalProperties": false
}The dashboard's notifications: failing monitors, a disconnected or outdated WordPress plugin, a silent real-user beacon, domain and ownership problems, safe updates that need a look, paused Slack or webhook alerts, and billing.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}A site's speed: the performance summary, lab Core Web Vitals, real visitors' LCP / INP / CLS (p75, last 7 days against the 28 before, per page type and device), what slows it (the elements, images and scripts behind slow visits) and the top fixes with steps.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Quarantine mode (WordPress, paid plans): 48 hours of hourly security runs after a cleanup, with plugin updates paused. Whether it's available, on, until when, every change it saw (expected or not), which monitors it watches, the runs it would use, and past sessions.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}One run in detail: status, error and warnings (each with its key for ignore_finding; ignored ones marked; one Relvato never fixes carries noFix — why, and what to do instead), each step, visual comparisons (each with its comparisonId, links to the screenshot, the baseline and the diff that work for 10 minutes, and whether a decision on it can be undone), metrics, the one-click fix the run proposes if any, and Relvato AI's suggestion once requested. Large metrics are compacted, never the findings: daily series become summaries and what was left out is listed in metricsTrimmed.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The run id |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"runId": {
"type": "string",
"description": "The run id"
}
},
"additionalProperties": false
}Follow a safe update or deactivation: applying → verifying → passed, or reverted with the monitors that broke.
| Argument | Type | Description |
|---|---|---|
| changeId* | string | From start_safe_update |
{
"type": "object",
"required": [
"changeId"
],
"properties": {
"changeId": {
"type": "string",
"description": "From start_safe_update"
}
},
"additionalProperties": false
}How a site has been doing: the share of monitors passing now (the Overview's "Monitors passing") and each of the last 30 days, the trend over 28, 90 or 182 days, each monitoring group's briefing (what needs attention, its likely cause and fix), and — on paid plans — uptime from Relvato's own probes (availability % and incidents over 30 days).
| Argument | Type | Description |
|---|---|---|
| range | number | Trend length in days (default 28) |
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"range": {
"enum": [
28,
90,
182
],
"type": "number",
"description": "Trend length in days (default 28)"
},
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}A site's Settings tab as values: what update_site_settings may change (name, request pacing, spacing between runs, firewall retry delay, flaky-monitor recovery streak, plugin rollback, counting Relvato's own visits in real-user data), what only the dashboard changes (browser identity, proxy, firewall allowlist token — never its value — GitHub, Google / Bing connections), the WordPress plugin's version, and the real-user beacon snippet.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Public status pages (title, public link, sites, on/off) and monthly client reports per site (on/off, how many recipients, last sent), plus the report branding. Never a report's private link or recipients' addresses. Edited in the dashboard's Agency page.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}WordPress sites: the safe auto-update policy and its recent windows (what was updated, rolled back or skipped, and why), plugin versions held back after a rollback, safe updates or deactivations Relvato made and their outcome, and the hardening settings that are on.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Stop a finding (a warning on a run, by its key from get_run) from counting on this monitor: it stays on the run, marked ignored, but no longer alerts or fails later runs. Undo with unignore_finding. Only do this when the user says the finding is expected.
| Argument | Type | Description |
|---|---|---|
| key* | string | The finding's key (get_run warnings[].key) |
| runId* | string | The run the finding is on |
{
"type": "object",
"required": [
"runId",
"key"
],
"properties": {
"key": {
"type": "string",
"description": "The finding's key (get_run warnings[].key)"
},
"runId": {
"type": "string",
"description": "The run the finding is on"
}
},
"additionalProperties": false
}Ignore specific element changes on a page from now on (signatures from get_run metrics.pages[].added / removed / countChanges[].sig), e.g. a widget that comes and goes. Undo with undo_structure_review.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The run |
| pageKey* | string | The page |
| signatures* | array | The element signatures to ignore, from the run (get_run metrics.pages[].added / removed / countChanges[].sig) |
{
"type": "object",
"required": [
"runId",
"pageKey",
"signatures"
],
"properties": {
"runId": {
"type": "string",
"description": "The run"
},
"pageKey": {
"type": "string",
"description": "The page"
},
"signatures": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "The element signatures to ignore, from the run (get_run metrics.pages[].added / removed / countChanges[].sig)"
}
},
"additionalProperties": false
}Ignore the area that changed on this comparison from now on (a clock, a rotating banner): it's added to the baseline's ignored regions. Undo with undo_visual_review. A mask (update_visual_monitor) is often the better fix.
| Argument | Type | Description |
|---|---|---|
| comparisonId* | string | From get_run visualComparisons[].comparisonId |
{
"type": "object",
"required": [
"comparisonId"
],
"properties": {
"comparisonId": {
"type": "string",
"description": "From get_run visualComparisons[].comparisonId"
}
},
"additionalProperties": false
}The monitors that can be added to a site: key, what it catches, whether the current plan allows it, whether it's recommended for this site, and whether it's already added. Before the site's ownership is proven, runsNow says which can run now (started by hand) and which after proof; for a site added as "other", withWordPressPlugin lists what the WordPress plugin adds.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}A site's heartbeats — cron jobs, backups and scheduled tasks that check in by requesting their own URL: each one's state (new = waiting for its first ping, up, down), schedule (period + grace, in seconds), last ping, when the next is due at the latest, whether the plan covers it, recent missed or failed check-ins and pings, plus the account's heartbeats used / allowed. Full-access connections also get each ping URL (it's what the job requests; anyone with it can send pings).
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site's id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site's id"
}
},
"additionalProperties": false
}Recent runs, newest first, optionally for one site, one monitor or one status. Each has the monitor (checkId, checkName, and its key in `journey`), status, trigger, timing and its error / warning; get_run has the detail. For older runs pass `before` (the startedAt of the last run you got).
| Argument | Type | Description |
|---|---|---|
| limit | number | Max runs, 1-100 (default 25) |
| before | string | Only runs started before this time (ISO 8601): the next page |
| siteId | string | Only runs for this site id |
| status | string | Only runs with this status (a failure the user resolved counts as passed) |
| checkId | string | Only runs of this monitor |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max runs, 1-100 (default 25)"
},
"before": {
"type": "string",
"description": "Only runs started before this time (ISO 8601): the next page"
},
"siteId": {
"type": "string",
"description": "Only runs for this site id"
},
"status": {
"enum": [
"passed",
"failed",
"skipped",
"running",
"queued"
],
"type": "string",
"description": "Only runs with this status (a failure the user resolved counts as passed)"
},
"checkId": {
"type": "string",
"description": "Only runs of this monitor"
}
},
"additionalProperties": false
}List the websites in this Relvato account, with whether each is ready to run monitors.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Pause one monitoring group on a site for 1 hour, 24 hours or until resumed (maintenance, a redesign, a migration). The group's monitors that are on are switched off and remembered; when the time is up, or with resume_monitor_group, exactly those are switched back on, as far as the plan allows. Pausing a group that's already paused changes when it resumes. Pausing Security while the site is in quarantine stays in the dashboard. Tell the user which monitors stop watching and for how long, and get their go-ahead first. site_overview lists paused groups.
| Argument | Type | Description |
|---|---|---|
| group* | string | The monitoring group: uptime = uptime, heartbeats and port monitors; flow = user flows; security; design; performance; seo; domain; compliance = legal compliance (accessibility) |
| siteId* | string | The site id |
| duration* | string | How long: 1 hour, 24 hours, or until resumed |
{
"type": "object",
"required": [
"siteId",
"group",
"duration"
],
"properties": {
"group": {
"enum": [
"flow",
"security",
"design",
"performance",
"seo",
"domain",
"compliance",
"uptime"
],
"type": "string",
"description": "The monitoring group: uptime = uptime, heartbeats and port monitors; flow = user flows; security; design; performance; seo; domain; compliance = legal compliance (accessibility)"
},
"siteId": {
"type": "string",
"description": "The site id"
},
"duration": {
"enum": [
"1h",
"24h",
"until"
],
"type": "string",
"description": "How long: 1 hour, 24 hours, or until resumed"
}
},
"additionalProperties": false
}Have the AI write a custom monitor's recipe again: answer its question (status needs-input) with `answer`, or retry after it failed or went stale. The monitor stops running until the new recipe is approved.
| Argument | Type | Description |
|---|---|---|
| answer | string | Your reply to the AI's question (get_check custom.question) |
| checkId* | string | The custom monitor's id |
{
"type": "object",
"required": [
"checkId"
],
"properties": {
"answer": {
"type": "string",
"description": "Your reply to the AI's question (get_check custom.question)"
},
"checkId": {
"type": "string",
"description": "The custom monitor's id"
}
},
"additionalProperties": false
}Tell Relvato's team a run's result is wrong (it failed or warned about something that's fine). Sends the run's details and your note to Relvato's support team; it changes nothing on the run. To stop being told about a finding, use ignore_finding.
| Argument | Type | Description |
|---|---|---|
| note | string | What's wrong with the result (optional) |
| runId* | string | The run id |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"note": {
"type": "string",
"description": "What's wrong with the result (optional)"
},
"runId": {
"type": "string",
"description": "The run id"
}
},
"additionalProperties": false
}Ask Relvato's AI to suggest a fix for a run that failed or found a problem (the dashboard's "Suggest a fix"). It answers in a minute or two: read it as aiFix on get_run. Plan-gated. get_fix_prompt gives the same brief for you to reason with yourself, without waiting.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The run id |
{
"type": "object",
"required": [
"runId"
],
"properties": {
"runId": {
"type": "string",
"description": "The run id"
}
},
"additionalProperties": false
}Resume a paused monitoring group now: the monitors its pause switched off go back on (a monitor the plan no longer allows stays off, with the reason in keptOff). A group that isn't paused is left as it is.
| Argument | Type | Description |
|---|---|---|
| group* | string | The paused group (site_overview pausedGroups) |
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId",
"group"
],
"properties": {
"group": {
"enum": [
"flow",
"security",
"design",
"performance",
"seo",
"domain",
"compliance",
"uptime"
],
"type": "string",
"description": "The paused group (site_overview pausedGroups)"
},
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Turn webhook alerts back on after Relvato paused them for repeated failed deliveries (fix the endpoint first; send_test_alert checks it).
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Send a test alert on one channel (email, slack or webhook) to check it arrives. Slack and webhooks are on paid plans and must be set up in the dashboard.
| Argument | Type | Description |
|---|---|---|
| channel* | string | Which channel to send the test alert on |
{
"type": "object",
"required": [
"channel"
],
"properties": {
"channel": {
"enum": [
"email",
"slack",
"webhook"
],
"type": "string",
"description": "Which channel to send the test alert on"
}
},
"additionalProperties": false
}Plain-language health verdict for a site: what needs attention (real issues vs likely false positives), each monitor with its latest run and schedule, setup state, recommended monitors not yet added, and the account's run usage. On WordPress 6.9+ it also lists the site's AI abilities (WordPress Abilities API) from the latest exposure scan: which plugin registered each, whether AI assistants (MCP Adapter) or REST clients can use it, which ones anyone can run without signing in, and which can delete data.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}The onboarding shortcut: pick what matters and Relvato adds the monitors that cover it on the current plan (plus uptime, SSL, errors, maintenance mode and structure). Goals: flows (checkout and sign-in), security, search, design, compliance (law compliance — accessibility today), speed, domain, custom, ai. Before the site's ownership is proven the monitors are added but don't run on their schedule yet (scheduleStarts).
| Argument | Type | Description |
|---|---|---|
| goals* | array | What the user wants watched, one or more (see the list above) |
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId",
"goals"
],
"properties": {
"goals": {
"type": "array",
"items": {
"enum": [
"flows",
"security",
"search",
"design",
"compliance",
"speed",
"domain",
"custom",
"ai"
],
"type": "string"
},
"minItems": 1,
"description": "What the user wants watched, one or more (see the list above)"
},
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}After a hack or a cleanup (WordPress, paid plans): run the security monitors every hour for 48 hours, pause plugin updates (with Relvato plugin 1.77.0+ that pause is a tick box in WordPress → Relvato), and alert on every unexpected change. Uses runs (get_quarantine says how many). Stopping it early stays in the dashboard.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}WordPress sites: for a vulnerable or outdated plugin a run found (get_run warnings with a plugin), update it (or deactivate it) through the Relvato plugin, re-run the monitors that were passing, and undo it if any of them breaks. Counts as runs. Follow it with get_safe_update. Get the user's go-ahead first. With Relvato plugin 1.77.0+ the change is made in WordPress by an administrator (answer: applyInWordPress, a link to give the user); Relvato verifies it, and if it breaks a monitor Relvato alerts the user to undo it there.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The run that found the plugin |
| action* | string | update: to the fixed (or latest) version; deactivate: switch the plugin off |
| plugin* | string | The plugin's slug (the finding's subject.slug) |
{
"type": "object",
"required": [
"runId",
"plugin",
"action"
],
"properties": {
"runId": {
"type": "string",
"description": "The run that found the plugin"
},
"action": {
"enum": [
"update",
"deactivate"
],
"type": "string",
"description": "update: to the fixed (or latest) version; deactivate: switch the plugin off"
},
"plugin": {
"type": "string",
"description": "The plugin's slug (the finding's subject.slug)"
}
},
"additionalProperties": false
}Run a site's enabled monitors now — or one group of them (group), or one monitor with checkId, even if it's turned off. Each run counts toward the monthly run quota. Runs go one at a time and take from seconds to a few minutes each, so all of a site's monitors usually take several minutes: the result's estimatedMinutes and tellUser say how long, so tell the user to expect a wait. Returns the runIds to follow with get_run or list_runs; cancel_queued_runs stops the ones that haven't started.
| Argument | Type | Description |
|---|---|---|
| group | string | Run only this group's enabled monitors (as the dashboard's Run group): uptime = uptime, heartbeats and port monitors; flow = user flows; security; design; performance; seo; domain; compliance = legal compliance (accessibility) |
| siteId* | string | The site id |
| checkId | string | Run only this monitor |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"group": {
"enum": [
"flow",
"security",
"design",
"performance",
"seo",
"domain",
"compliance",
"uptime"
],
"type": "string",
"description": "Run only this group's enabled monitors (as the dashboard's Run group): uptime = uptime, heartbeats and port monitors; flow = user flows; security; design; performance; seo; domain; compliance = legal compliance (accessibility)"
},
"siteId": {
"type": "string",
"description": "The site id"
},
"checkId": {
"type": "string",
"description": "Run only this monitor"
}
},
"additionalProperties": false
}Undo the last accept or ignore on a page of the structure monitor.
| Argument | Type | Description |
|---|---|---|
| runId* | string | The run |
| pageKey* | string | The page |
{
"type": "object",
"required": [
"runId",
"pageKey"
],
"properties": {
"runId": {
"type": "string",
"description": "The run"
},
"pageKey": {
"type": "string",
"description": "The page"
}
},
"additionalProperties": false
}Undo the last accept or ignore on this page, device and browser: the earlier baseline comes back.
| Argument | Type | Description |
|---|---|---|
| comparisonId* | string | From get_run visualComparisons[].comparisonId |
{
"type": "object",
"required": [
"comparisonId"
],
"properties": {
"comparisonId": {
"type": "string",
"description": "From get_run visualComparisons[].comparisonId"
}
},
"additionalProperties": false
}Make an ignored finding count again (get_check lists a monitor's ignored findings with their keys; get_run marks them on a run).
| Argument | Type | Description |
|---|---|---|
| key* | string | The finding's key |
| runId | string | Optional: apply it to this run right away |
| checkId* | string | The monitor |
{
"type": "object",
"required": [
"checkId",
"key"
],
"properties": {
"key": {
"type": "string",
"description": "The finding's key"
},
"runId": {
"type": "string",
"description": "Optional: apply it to this run right away"
},
"checkId": {
"type": "string",
"description": "The monitor"
}
},
"additionalProperties": false
}Change how often alerts are sent (instant and/or a daily or weekly digest), when the digest goes out, the minimum severity, and whether every run is emailed. Only the fields you pass change. Who gets alerts (the address, Slack, webhooks), muting sites or monitor types, and turning email alerts off stay in the dashboard.
| Argument | Type | Description |
|---|---|---|
| everyRun | boolean | Email every run, not only problems |
| timezone | string | IANA time zone for the digest, e.g. Europe/Berlin |
| frequency | array | When alerts go out: instant (as it happens), a daily digest, a weekly digest — one or more |
| digestTime | string | HH:MM (24h) for the daily / weekly digest |
| minSeverity | string | Only alert on problems at least this serious |
| digestWeekday | number | Weekly digest day, 0 = Sunday … 6 = Saturday |
{
"type": "object",
"properties": {
"everyRun": {
"type": "boolean",
"description": "Email every run, not only problems"
},
"timezone": {
"type": "string",
"description": "IANA time zone for the digest, e.g. Europe/Berlin"
},
"frequency": {
"type": "array",
"items": {
"enum": [
"instant",
"daily",
"weekly"
],
"type": "string"
},
"minItems": 1,
"description": "When alerts go out: instant (as it happens), a daily digest, a weekly digest — one or more"
},
"digestTime": {
"type": "string",
"description": "HH:MM (24h) for the daily / weekly digest"
},
"minSeverity": {
"enum": [
"warning",
"low",
"medium",
"high",
"critical"
],
"type": "string",
"description": "Only alert on problems at least this serious"
},
"digestWeekday": {
"type": "number",
"description": "Weekly digest day, 0 = Sunday … 6 = Saturday"
}
},
"additionalProperties": false
}Turn a monitor on or off, or change when it runs: its schedule (up to weekly on Free, daily on Pro, hourly on Business, every 15 minutes on Agency), re-runs when the WordPress site changes (plugin, theme, core or WooCommerce updates; Pro and up) and random extra runs (Business and up). Only the fields you pass change. Its own settings (pages, URLs, checkout details) are changed with update_check_settings or update_visual_monitor.
| Argument | Type | Description |
|---|---|---|
| at | string | Daily/weekly run time, HH:MM (24h) |
| tz | string | IANA timezone for `at`, e.g. Europe/Berlin |
| dow | number | Weekly only: weekday, 0 = Sunday … 6 = Saturday |
| events | array | WordPress sites only: re-run when these change. [] = none. A monitor's built-in triggers (e.g. the admin roster's role changes) are kept. |
| random | object | null | Random extra runs (times per days), with an off or weekly schedule; null turns them off |
| checkId* | string | The monitor's id (from site_overview or add_checks) |
| enabled | boolean | Turn the monitor on or off |
| schedule | string | Recurring schedule |
Change a monitor's own settings. Each monitor takes only its sections (get_check lists them as editable.sections): checkout (checkout monitors), devices (flow and page monitors), errorScan, brokenLinks, accessibilityPages (accessibility), uptime (the URL, text that must / must not appear, accepted statuses, timeout, alert after N minutes, maintenance windows, an API endpoint's method / body / JSON rules), aiOutput, browseUrl (storefront), shopUrl / productUrl (prices), dkimSelectors (email authentication), structurePages (structure drift), webVitalsDevices (Core Web Vitals). Every address must be a full URL on the site's own domain. A section you pass replaces that section; the rest stays. Turning it on or off and its schedule: update_check. The visual monitor: update_visual_monitor.
| Argument | Type | Description |
|---|---|---|
| uptime | object | Uptime: what the probes check and when they alert. The whole section is replaced: fields left out go back to their defaults (except maintenance, kept unless sent) |
| checkId* | string | The monitor's id |
| devices | array | Flow and page monitors |
| shopUrl | string | Prices: the shop page |
| aiOutput | object | The site's own AI feature: its endpoint (full URL on the site), a fixed prompt, and what the answer must (not) contain |
| checkout | object |
Rename a heartbeat, change its period or grace, or pause / resume it. Only the fields you pass change. Paused: pings are still recorded but nothing is judged or alerted (an open outage ends without a "back" alert); resumed, it waits for its next ping. Deleting a heartbeat stays in the dashboard.
| Argument | Type | Description |
|---|---|---|
| tz | string | The cron expression's IANA time zone |
| cron | string | A cron expression to use instead of the period ("" switches back to the period) |
| name | string | New name |
| paused | boolean | true pauses it, false resumes it |
| graceSec | number | Grace time in seconds (60 to 604800) |
| periodSec | number | How often the job runs, in seconds (60 to 2678400); switches a cron schedule back to a period |
| heartbeatId* | string | The heartbeat's id (from list_heartbeats or add_heartbeat) |
{
"type": "object",
"required": [
"heartbeatId"
],
"properties": {
"tz": {
"type": "string",
"description": "The cron expression's IANA time zone"
},
"cron": {
"type": "string",
"description": "A cron expression to use instead of the period (\"\" switches back to the period)"
},
"name": {
"type": "string",
"description": "New name"
},
"paused": {
"type": "boolean",
"description": "true pauses it, false resumes it"
},
"graceSec": {
"type": "number",
"description": "Grace time in seconds (60 to 604800)"
},
"periodSec": {
"type": "number",
"description": "How often the job runs, in seconds (60 to 2678400); switches a cron schedule back to a period"
},
"heartbeatId": {
"type": "string",
"description": "The heartbeat's id (from list_heartbeats or add_heartbeat)"
}
},
"additionalProperties": false
}Change a site's operational settings. Only the fields you pass change. Browser identity, the proxy, the firewall token, GitHub and search-engine connections, and deleting the site stay in the dashboard.
| Argument | Type | Description |
|---|---|---|
| name | string | Display name |
| siteId* | string | The site id |
| aiTriage | string | Relvato AI triage of failed runs: label = each failure labelled needs attention / likely noise / repeat; hold = also hold back the instant alert of a confident likely-noise failure (never checkout, sign-in, uptime or security; still in the bell and digest); aside = also set that failure aside (out of the bell, digest and site health; the owner brings it back in the app); off = none (Pro and up; sends run details to Anthropic) |
| pacingMs | number | null | Pause between a run's requests, 0-60000 ms; null = automatic |
| jobSpacingMs | number | null | Pause between this site's runs, 0-900000 ms; null/0 = none |
| recoverStreak | number | null | Clean runs before a flaky monitor alerts again, 2-10; null = 5 |
| pluginRollback | boolean | WordPress: roll a plugin update back when it breaks a monitor |
| challengeRetryMs |
Edit the visual regression monitor: add pages (a built-in one by key, or a page of your own by its address on the site, e.g. "/pricing"; up to 10 of your own), rename or re-point a page of your own, change any page's masks (CSS selectors painted over before comparing, for clocks, carousels, ads), remove pages, and set devices, browsers, full-page capture, the change threshold (percent) and the AI review. A page whose masks or address change gets a new baseline: its next run captures one for the user to approve. At most 40 screenshots a run (pages × devices × browsers). get_check lists the current pages and their keys.
| Argument | Type | Description |
|---|---|---|
| add | array | Pages to start checking: each a built-in page (page) or one of your own (url) |
| remove | array | Keys of pages to stop checking |
| update | array | Pages already checked to change, by key: a new address, name or masks |
| checkId* | string | The visual regression monitor's id |
| devices | array | Screen sizes to capture each page at (replaces the current list) |
| aiReview | boolean | Let AI review a change before it alerts (default on) |
| browsers | array |
Check whether the site's ownership is proven: probes the WordPress plugin connection and/or looks for the domain-verification DNS TXT record / meta tag, or (method gsc / bing) asks Google Search Console / Bing Webmaster Tools. Returns the updated setup state. Docs: https://www.relvato.com/docs/verify-site-ownership
| Argument | Type | Description |
|---|---|---|
| method | string | Domain verification only: check just this method (default: DNS and meta tag). gsc / bing ask Google Search Console / Bing Webmaster Tools whether the account connected to the site (in the dashboard) owns it — Search Console owners only, not full or restricted users |
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"method": {
"enum": [
"dns",
"meta",
"gsc",
"bing"
],
"type": "string",
"description": "Domain verification only: check just this method (default: DNS and meta tag). gsc / bing ask Google Search Console / Bing Webmaster Tools whether the account connected to the site (in the dashboard) owns it — Search Console owners only, not full or restricted users"
},
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}Check that the real-user Web Vitals beacon is on the site (its homepage, or data already arriving). get_site_settings has the snippet to install.
| Argument | Type | Description |
|---|---|---|
| siteId* | string | The site id |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"siteId": {
"type": "string",
"description": "The site id"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"siteId",
"name"
],
"properties": {
"tz": {
"type": "string",
"description": "The cron expression's IANA time zone, e.g. Europe/Bucharest (default UTC)"
},
"cron": {
"type": "string",
"description": "Instead of a period: the job's cron expression (five fields, e.g. \"0 3 * * *\" or \"*/15 * * * 1-5\"; @daily, @hourly … work too). A ping is then due by each time it fires plus the grace"
},
"name": {
"type": "string",
"description": "What the job is, e.g. \"Nightly backup\""
},
"siteId": {
"type": "string",
"description": "The site's id"
},
"graceSec": {
"type": "number",
"description": "How late a ping may be before it counts as missed, in seconds (60 to 604800 = 7 days; default 3600)"
},
"periodSec": {
"type": "number",
"description": "How often the job runs, in seconds (60 to 2678400 = 31 days; default 86400 = daily). Ignored when `cron` is set"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"checkId"
],
"properties": {
"at": {
"type": "string",
"description": "Daily/weekly run time, HH:MM (24h)"
},
"tz": {
"type": "string",
"description": "IANA timezone for `at`, e.g. Europe/Berlin"
},
"dow": {
"type": "number",
"description": "Weekly only: weekday, 0 = Sunday … 6 = Saturday"
},
"events": {
"type": "array",
"items": {
"enum": [
"plugin",
"theme",
"core",
"woocommerce"
],
"type": "string"
},
"description": "WordPress sites only: re-run when these change. [] = none. A monitor's built-in triggers (e.g. the admin roster's role changes) are kept."
},
"random": {
"type": [
"object",
"null"
],
"required": [
"times",
"days"
],
"properties": {
"days": {
"type": "number",
"description": "over 1-365 days"
},
"times": {
"type": "number",
"description": "1-100 runs"
}
},
"description": "Random extra runs (times per days), with an off or weekly schedule; null turns them off",
"additionalProperties": false
},
"checkId": {
"type": "string",
"description": "The monitor's id (from site_overview or add_checks)"
},
"enabled": {
"type": "boolean",
"description": "Turn the monitor on or off"
},
"schedule": {
"enum": [
"off",
"weekly",
"daily",
"6h",
"hourly",
"fastest"
],
"type": "string",
"description": "Recurring schedule"
}
},
"additionalProperties": false
}| Checkout monitors |
| browseUrl | string | Storefront: the shop page (blank = the calibrated one) |
| errorScan | object | Extra pages to scan (full URLs on the site) and error texts to ignore |
| productUrl | string | Prices: a sample product |
| brokenLinks | object | Extra pages to crawl, address fragments to skip, and whether external links are checked too |
| dkimSelectors | array | Email authentication: your mail provider's DKIM selectors (up to 10) |
| structurePages | array | Structure drift: pages to fingerprint |
| webVitalsDevices | array | Core Web Vitals: devices to measure |
| accessibilityPages | array | Accessibility: extra pages to test on top of the key pages (full URLs on the site, up to 20). A new page's issues are reviewed on its first scan, not failed |
{
"type": "object",
"required": [
"checkId"
],
"properties": {
"uptime": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Page to check (full URL on the site; blank = the homepage)"
},
"body": {
"type": "string",
"description": "POST only: the request body (sent as JSON when it parses as JSON; up to 2,000 characters). No custom headers or secrets"
},
"json": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"op"
],
"properties": {
"op": {
"enum": [
"equals",
"not-equals",
"contains",
"exists",
"missing",
"lt",
"gt"
],
"type": "string",
"description": "How the value at path is tested: equals / not-equals / contains value, exists / missing (no value needed), lt / gt a number"
},
"path": {
"type": "string",
"description": "Dot path into the JSON answer"
},
"value": {
"type": "string",
"description": "What to compare with (a number for lt / gt; not needed for exists / missing)"
}
},
"additionalProperties": false
},
"description": "Rules on a JSON answer (up to 10; down when any fails): the value at `path` (\"status\", \"checks.db.ok\", \"items[0].id\") tested with `op` against `value`"
},
"method": {
"enum": [
"GET",
"HEAD",
"POST"
],
"type": "string",
"description": "API endpoints: the request method (default GET)"
},
"absentText": {
"type": "string",
"description": "Down if the page contains this text"
},
"expectText": {
"type": "string",
"description": "Down if the page doesn't contain this text"
},
"okStatuses": {
"type": "string",
"description": "Accepted status codes, e.g. \"200-299, 301\" (blank = any non-error answer)"
},
"timeoutSec": {
"type": "number",
"description": "Down if there's no answer within this many seconds (5-30, default 15)"
},
"maintenance": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind"
],
"properties": {
"to": {
"type": "string",
"description": "once: end, ISO 8601 (at most 7 days after the start)"
},
"tz": {
"type": "string",
"description": "weekly: IANA time zone, e.g. Europe/Bucharest"
},
"days": {
"type": "array",
"items": {
"type": "number"
},
"description": "weekly: weekdays, 0 = Sunday … 6 = Saturday"
},
"from": {
"type": "string",
"description": "once: start, ISO 8601 with a time zone"
},
"kind": {
"enum": [
"once",
"weekly"
],
"type": "string",
"description": "once: one window (from, to); weekly: a repeating one (days, start, minutes, tz)"
},
"note": {
"type": "string",
"description": "Optional label, e.g. \"Host migration\""
},
"start": {
"type": "string",
"description": "weekly: local start time, HH:MM"
},
"minutes": {
"type": "number",
"description": "weekly: length in minutes (5-720)"
}
},
"additionalProperties": false
},
"description": "Maintenance windows (up to 10): no uptime alerts and no Uptime run inside them, and an outage that starts inside one counts as downtime only after it ends. Left out = keep the saved windows; [] clears them. A new one-off window can't start in the past"
},
"alertAfterMin": {
"type": "number",
"description": "Minutes down before alerting (0-60, default 0 = as soon as both regions confirm)"
},
"maxResponseMs": {
"type": "number",
"description": "The monitor's run warns above this response time (500-30000, default 8000); not counted as down"
}
},
"description": "Uptime: what the probes check and when they alert. The whole section is replaced: fields left out go back to their defaults (except maintenance, kept unless sent)",
"additionalProperties": false
},
"checkId": {
"type": "string",
"description": "The monitor's id"
},
"devices": {
"type": "array",
"items": {
"enum": [
"desktop",
"mobile"
],
"type": "string"
},
"description": "Flow and page monitors"
},
"shopUrl": {
"type": "string",
"description": "Prices: the shop page"
},
"aiOutput": {
"type": "object",
"required": [
"endpoint",
"prompt",
"mustInclude",
"mustExclude"
],
"properties": {
"golden": {
"type": "string",
"description": "Optional: a good answer to compare with; Relvato AI flags a big drop in how close the reply is"
},
"method": {
"enum": [
"POST",
"GET"
],
"type": "string",
"description": "HTTP method (default POST)"
},
"prompt": {
"type": "string",
"description": "The fixed prompt sent every run (keeping it the same is what makes a regression show)"
},
"endpoint": {
"type": "string",
"description": "The AI feature's endpoint Relvato calls: a full URL on the site"
},
"minLength": {
"type": "number",
"description": "Warn when the answer is shorter than this many characters"
},
"mustExclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "The answer must contain none of these, e.g. \"error\" or an apology (case-insensitive)"
},
"mustInclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "The answer must contain every one of these (case-insensitive)"
},
"bodyTemplate": {
"type": "string",
"description": "POST body as JSON; {{prompt}} is replaced with the prompt. Default {\"prompt\":\"{{prompt}}\"}"
},
"maxLatencyMs": {
"type": "number",
"description": "Warn when the answer takes longer than this, in milliseconds"
},
"responsePath": {
"type": "string",
"description": "Dot path to the answer text in the JSON reply, e.g. \"reply\" or \"choices.0.message.content\" (blank = the whole reply)"
}
},
"description": "The site's own AI feature: its endpoint (full URL on the site), a fixed prompt, and what the answer must (not) contain",
"additionalProperties": false
},
"checkout": {
"type": "object",
"properties": {
"depth": {
"enum": [
"ready",
"order"
],
"type": "string",
"description": "\"ready\" stops at the payment step; \"order\" places a REAL test order (the WordPress plugin marks it, keeps it out of stock, analytics and ad platforms, and removes it)"
},
"coupon": {
"type": [
"object",
"null"
],
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"description": "The coupon code"
},
"expect": {
"enum": [
"applies",
"rejected"
],
"type": "string",
"description": "What should happen: applies (default) or rejected"
}
},
"description": "Apply a coupon at checkout and check the outcome (null removes it)",
"additionalProperties": false
},
"expect": {
"type": [
"object",
"null"
],
"properties": {
"tax": {
"description": "\"applied\", \"none\" or an amount"
},
"total": {
"type": "object",
"properties": {
"max": {
"type": "number",
"description": "At most this"
},
"min": {
"type": "number",
"description": "At least this"
},
"equals": {
"type": "number",
"description": "Exactly this"
}
},
"description": "The order total, in the store's currency",
"additionalProperties": false
},
"discount": {
"description": "\"applied\", \"none\" or an amount"
},
"shipping": {
"description": "\"free\", \"charged\" or an amount"
}
},
"description": "What the order totals must be",
"additionalProperties": false
},
"shipping": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"description": "A shipping method to select, by its label or id (blank = whatever the store picks)"
},
"require": {
"type": "boolean",
"description": "Fail when no shipping method is offered (default true)"
}
},
"description": "Shipping at checkout: which method to pick, and whether one must be offered (null turns this off)",
"additionalProperties": false
},
"productUrl": {
"type": "string",
"description": "The product to buy (full URL on the site; blank = Relvato picks one)"
},
"verifyEmail": {
"type": "boolean",
"description": "Order mode: confirm the order email arrives"
},
"fieldAnswers": {
"type": "array",
"items": {
"type": "object",
"required": [
"match",
"value"
],
"properties": {
"match": {
"type": "string",
"description": "The field's label, name or id (case- and accent-insensitive)"
},
"value": {
"type": "string",
"description": "What to enter in it"
}
},
"additionalProperties": false
},
"maxItems": 12,
"description": "Answers for checkout fields Relvato can't fill by itself: match = the field's label or name, value = what to enter"
},
"paymentMethod": {
"enum": [
"cod",
"free"
],
"type": "string",
"description": "Order mode: how the test order is paid — cod (cash on delivery, the default) or free (a 100%-off coupon zeroes the total, for card-only stores)"
}
},
"description": "Checkout monitors",
"additionalProperties": false
},
"browseUrl": {
"type": "string",
"description": "Storefront: the shop page (blank = the calibrated one)"
},
"errorScan": {
"type": "object",
"required": [
"urls",
"ignore"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Extra pages to scan, full URLs on the site"
},
"ignore": {
"type": "array",
"items": {
"type": "string"
},
"description": "Error texts to ignore (a match anywhere in the message)"
}
},
"description": "Extra pages to scan (full URLs on the site) and error texts to ignore",
"additionalProperties": false
},
"productUrl": {
"type": "string",
"description": "Prices: a sample product"
},
"brokenLinks": {
"type": "object",
"required": [
"urls",
"ignore",
"checkExternal"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Extra pages to crawl, full URLs on the site"
},
"ignore": {
"type": "array",
"items": {
"type": "string"
},
"description": "Address fragments to skip (a link containing one isn't checked)"
},
"checkExternal": {
"type": "boolean",
"description": "Also check links to other sites"
}
},
"description": "Extra pages to crawl, address fragments to skip, and whether external links are checked too",
"additionalProperties": false
},
"dkimSelectors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Email authentication: your mail provider's DKIM selectors (up to 10)"
},
"structurePages": {
"type": "array",
"items": {
"enum": [
"home",
"shop",
"product",
"category",
"checkout"
],
"type": "string"
},
"description": "Structure drift: pages to fingerprint"
},
"webVitalsDevices": {
"type": "array",
"items": {
"enum": [
"desktop",
"mobile"
],
"type": "string"
},
"description": "Core Web Vitals: devices to measure"
},
"accessibilityPages": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accessibility: extra pages to test on top of the key pages (full URLs on the site, up to 20). A new page's issues are reviewed on its first scan, not failed"
}
},
"additionalProperties": false
}| number | null |
| Wait before retrying a run a firewall challenged, 0-3600000 ms; null = 10 minutes, 0 = never |
| rumIncludeOwnChecks | boolean | Count Relvato's own visits in real-user Web Vitals |
{
"type": "object",
"required": [
"siteId"
],
"properties": {
"name": {
"type": "string",
"description": "Display name"
},
"siteId": {
"type": "string",
"description": "The site id"
},
"aiTriage": {
"enum": [
"off",
"label",
"hold",
"aside"
],
"type": "string",
"description": "Relvato AI triage of failed runs: label = each failure labelled needs attention / likely noise / repeat; hold = also hold back the instant alert of a confident likely-noise failure (never checkout, sign-in, uptime or security; still in the bell and digest); aside = also set that failure aside (out of the bell, digest and site health; the owner brings it back in the app); off = none (Pro and up; sends run details to Anthropic)"
},
"pacingMs": {
"type": [
"number",
"null"
],
"description": "Pause between a run's requests, 0-60000 ms; null = automatic"
},
"jobSpacingMs": {
"type": [
"number",
"null"
],
"description": "Pause between this site's runs, 0-900000 ms; null/0 = none"
},
"recoverStreak": {
"type": [
"number",
"null"
],
"description": "Clean runs before a flaky monitor alerts again, 2-10; null = 5"
},
"pluginRollback": {
"type": "boolean",
"description": "WordPress: roll a plugin update back when it breaks a monitor"
},
"challengeRetryMs": {
"type": [
"number",
"null"
],
"description": "Wait before retrying a run a firewall challenged, 0-3600000 ms; null = 10 minutes, 0 = never"
},
"rumIncludeOwnChecks": {
"type": "boolean",
"description": "Count Relvato's own visits in real-user Web Vitals"
}
},
"additionalProperties": false
}| Browsers to capture each page in: chromium (Chrome, Edge), firefox, webkit (Safari); replaces the current list |
| fullPage | boolean | Capture the whole page (default) or only the first screen |
| thresholdPercent | number | How much of a page may change before it counts, 0-50 (default ~1) |
{
"type": "object",
"required": [
"checkId"
],
"properties": {
"add": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Or a page of your own: its address on the site (full URL or a path like /pricing)"
},
"page": {
"enum": [
"home",
"shop",
"product",
"category",
"checkout"
],
"type": "string",
"description": "A built-in page Relvato finds by itself"
},
"label": {
"type": "string",
"description": "A name for a page of your own (up to 60 characters)"
},
"masks": {
"type": "array",
"items": {
"type": "string"
},
"description": "CSS selectors to mask on this page"
}
},
"additionalProperties": false
},
"description": "Pages to start checking: each a built-in page (page) or one of your own (url)"
},
"remove": {
"type": "array",
"items": {
"type": "string"
},
"description": "Keys of pages to stop checking"
},
"update": {
"type": "array",
"items": {
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "The page's key (from get_check)"
},
"url": {
"type": "string",
"description": "Pages of your own: a new address"
},
"label": {
"type": "string",
"description": "Pages of your own: a new name"
},
"masks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Replaces the page's masks ([] removes them)"
}
},
"additionalProperties": false
},
"description": "Pages already checked to change, by key: a new address, name or masks"
},
"checkId": {
"type": "string",
"description": "The visual regression monitor's id"
},
"devices": {
"type": "array",
"items": {
"enum": [
"desktop",
"mobile"
],
"type": "string"
},
"description": "Screen sizes to capture each page at (replaces the current list)"
},
"aiReview": {
"type": "boolean",
"description": "Let AI review a change before it alerts (default on)"
},
"browsers": {
"type": "array",
"items": {
"enum": [
"chromium",
"firefox",
"webkit"
],
"type": "string"
},
"description": "Browsers to capture each page in: chromium (Chrome, Edge), firefox, webkit (Safari); replaces the current list"
},
"fullPage": {
"type": "boolean",
"description": "Capture the whole page (default) or only the first screen"
},
"thresholdPercent": {
"type": "number",
"description": "How much of a page may change before it counts, 0-50 (default ~1)"
}
},
"additionalProperties": false
}