Skip to main content

What are review agents?

Build review agents for your product. Point an agent at a URL, and it reviews the content and posts findings as comment annotations. Review agents can review anything you can surface:
  • Web pages and sites: text, screenshots, HTML, CSS, links, accessibility tree, Lighthouse.
  • Your data: pull any REST endpoint into the review with the rest-api strategy.
  • Charts, dashboards, and more: anything you can expose via an API or MCP server.
You write a prompt and pick a few config options. The platform handles context gathering, LLM invocation, post-processing, deduplication, and annotation creation. You can also put agent creation in your users’ hands: ship the built-in agents as defaults, and let users create custom agents in plain English from your UI. The prompt tools turn a one-line instruction into a production agent config.

What you get

  • Built-in and custom agents. Ready-made agents (Proofreader, Link Checker, Image Inspector, Mobile Inspector, Consistency Checker, PII, Lighthouse, accessibility, and more), or your own from a prompt.
  • Plain-English agent builder. Let your users describe a review in simple English; prompt tools (enhance, validate, refine) check it, expand it into a full agent config, and iterate on feedback. userContextFields render typed inputs in your setup UI.
  • Pluggable context gathering. Stack strategies: page text, screenshots, HTML, CSS, links, accessibility tree, computed styles, robots.txt, sitemap, Lighthouse, live REST API data.
  • Live REST API context. The rest-api strategy fetches your endpoints at execution time and injects the responses into the prompt. Secrets are encrypted at rest and redacted on read.
  • MCP tool use. The mcp-tools strategy runs a multi-turn tool loop against your remote MCP servers. Works with Claude and Gemini.
  • Versioned configurations. Every behavioral edit creates a new version; one-click restore rolls back.
  • Async execution. Run Execution returns an executionId immediately; poll Get Execution until status !== "running".
  • Cross-page execution. Set crossPageExecute: true to crawl the seed URL and review up to maxUrlsToProcess pages.
  • Page lists. Send urls to review exactly those pages, with no crawl. Built for sites whose pages differ only by a query string.
  • Several agents, one request. Send agentIds to run up to 10 agents together, on one page or on a list of pages. Each agent still gets its own execution, and each page is loaded once for all of them.
  • Focused rechecks. Set userContext.focusIssueTypes to recheck only some issue types, for example only blurry images.
  • Per-run options. Switch individual checks of a built-in agent off, or tune its thresholds, for one run. See Per-run options.
  • Device emulation. Run each execution as "mobile" or "desktop".
  • Re-run deduplication. Re-running an agent replaces the prior run’s suggestions instead of piling up duplicates. A focused recheck replaces only the suggestions of the issue types it rechecks.
  • Token usage analytics. Per-agent, per-model, per-month token usage via the Analytics endpoint.
  • Agent groups. Bundle related agents (e.g. “Brand QA”) and filter lists by group.

Use cases

Brand consistency

Verify brand colors, typography, and logo placement across your marketing pages. Re-run on every deploy.

Pre-launch QA

Run the Proofreader, Link Checker, and accessibility agents before a release. Findings land on the staging document.

Content moderation

Flag PII and profanity on user-generated pages. Pair with Review Workflow Builder for human review.

Cross-page audit

Set crossPageExecute: true and the crawler discovers internal links, then reviews each page.

Data-enriched checks

Pull live business data into the prompt with rest-api, e.g. validate on-page pricing against your billing API.

Workflow integration

Trigger an agent from a Review Workflow Builder workflow node and park the workflow on its findings.

User-built agents

Let your users create review agents in plain English from your UI. Ship built-in agents as defaults; prompt tools turn user instructions into custom ones.

Docs accuracy

Use mcp-tools to verify on-page code snippets live against your documentation MCP server.

How it works

  1. Define the agent. Call Create Agent with a name, instructions, and config (context gathering, execution strategy, post-processing).
  2. Run an execution. Call Run Execution with agentId and url, or with agentIds to run several agents on the same pages. Returns an executionId per agent immediately.
  3. Poll for results. Call Get Execution until status !== "running". Set includeResults: true for per-URL findings.
  4. Findings appear as annotations. Each finding becomes a comment annotation on the document referenced by organizationId / documentId (on by default).

Mental model

Execution lifecycle:

Pipeline phases

Each agent run executes sequential phases:

Execution statuses

Terminal status precedence: error > partial > failed > passed. A run that produced findings but had a single failing page surfaces as partial (not error). For partial/error, per-page failure detail is in resultsSummary.urlsErrored and resultsSummary.erroredUrls.

Built-in agents

Built-in agents are pre-registered for every workspace. Run one by its ID. When a finding comes with an exact correction, such as a corrected spelling or link, the agent puts it in suggestedFix. The comment annotation carries it as agent.reason.suggestedFix.
Display names can change between releases. Identify agents by their ID.

Issue types

These built-in agents tag every finding with one of a fixed set of issueType values. Use them to filter findings, or pass some of them in userContext.focusIssueTypes on Run Execution to recheck only those issues. A focused run also skips work that cannot produce the listed issue types. A Mobile Inspector run focused on small-tap-target taps neither the menu nor same-page links, and a Consistency Checker run focused only on cross-page-casing or the visual issue types (style-mismatch, missing-hover, hover-invisible) makes no model call.
To have the Link Checker report broken links only, run it with userContext.focusIssueTypes set to ["broken-link"]. To stop it looking for a kind of problem at all, use its per-run options.

Per-run options

Seven built-in agents read options from the userContext of Run Execution. Use them to switch a check off or tune a threshold for one run. Leave a key out to keep its default: the defaults are the agent’s normal behavior. A value of the wrong type is ignored, and the default applies. Each agent reads only its own keys, so a run with agentIds can carry options for several agents in one userContext:
Options for broken-links. The three staging word lists take single host words of 2 to 30 letters or digits, at most 50 per list. ignoreOverlaySelectors and skipClickLabels take at most 20 entries, of at most 200 and 60 characters. Other entries are ignored. During the click test, a click that opens a new tab, starts a download, or hands off to an app counts as working. A page that builds its content from data queries the test refuses, such as GraphQL, is not judged for dead controls.

Proofreader

Options for spell-check. The Proofreader finds candidates with a dictionary and rules, then asks a verification model to confirm the ones the rules are not certain of. If the model cannot answer, the run still reports the findings the rules are certain of, and its summary says what could not be checked. acceptedWords and brandNames take single words. The first 500 entries are read, and an entry longer than 64 characters is ignored. The verification model checks at most 20,000 candidates per API key per UTC day. Past that, the Proofreader reports only the findings its rules are certain of, and the run summary says The daily spelling check limit was reached.
The Proofreader also reports lorem ipsum. A run with agentIds that starts both spell-check and lorem-ipsum sets loremIpsumOnSamePages: true for you, so each lorem ipsum line is reported once, by the Lorem Ipsum agent. It does not when you send skipChecks or loremIpsumOnSamePages yourself. If you run the two agents on the same pages in separate requests, send loremIpsumOnSamePages: true to the Proofreader. The Proofreader cannot see whether the Lorem Ipsum execution succeeds: if it fails, lorem ipsum on those pages goes unreported, so send loremIpsumOnSamePages: false when you want both.

Consistency Checker

Options for consistency-checker. Its keys start with consistency because a run with agentIds shares one userContext across every agent. A visual finding names the elements it groups in metadata.labels. A style-mismatch finding also lists what differs in metadata.differences, one entry per property: { property, value, dominant, dominantCount, css }, where css is the declaration the rest of the site uses, such as border-radius: 8px. Its suggestion names the first declaration and counts the others. Read metadata on the findings of Get Execution with includeResults: true.

Image Inspector

Options for image-inspector. A value outside its range is ignored, and the default applies. Images without alt text are reported as one finding: pinned on the image when there is one, and page-level when there are several. The bad-crop check is the Image Inspector’s only model call, and it is off unless turned on. A run focused on other issue types never runs it. When the model gives no usable answer, the run summary says Photo crops could not be checked.

Mobile Inspector

Options for mobile-inspector. A value outside its range is ignored, and the default applies. The phone checks for sideways scrolling, overflow, cut-off content, and small tap targets always run. With menu skipped, the menu is not judged, and links that sit in a hidden phone menu are never reported as missing on phones.

Migration Parity

Options for migration-parity. liveSiteUrl is required. A run without a usable liveSiteUrl, or whose live site is the site of the run’s url, returns INVALID_ARGUMENT before any execution is created, with Migration Parity needs the live site to compare against: send userContext.liveSiteUrl (a full address or a bare domain) or Migration Parity needs a live site other than the project site: userContext.liveSiteUrl names the same site as the run's url. In a run with agentIds, Migration Parity is listed in data.failed and the other agents still start. For each page, the agent finds the same page on the live site and reports what the live page has that the new one lost. Names, numbers, and addresses are compared exactly; a phone number counts as kept in any written form. Contact details the live site shows only in its header or footer are compared once per run, on the run’s first page. Live pages are read without your site access credentials, and only on public addresses. A page that was not compared gets no findings, keeps its earlier suggestions, and says why in the run summary: no matching live page, a live site that could not be read, a live page that timed out or refused the visit, too little text on either page, or a sign-in wall in front of either page. A page skipped for a sign-in wall is not billed. Each finding carries livePageUrl and missing (the missing items, at most 20) in agent.reason. Each page’s result on Get Execution with includeResults: true carries agentResult.report: livePageUrl, match ("same-path", "sitemap", or "none"), compared (how many bios, reviews, FAQs, phone numbers, emails, addresses, and list items were compared), and skipped ("gated" or "live-gated" when a sign-in wall stood in front of the page or its live page).

Content Request List

Options for content-request-list. All are optional. The agent posts one page-level finding per page, with issue type content-requests. The whole checklist is on the finding’s agent.reason.contentRequests and on each page’s agentResult.report.contentRequests in Get Execution results: items { kind, label, section?, text?, annotationId?, count? }, where kind is empty-section, placeholder-text, coming-soon, placeholder-image, thin-bio, or open-question. It reads the run document’s open comment threads and quotes one only when the run’s audience can already see it: a public thread always, an organization-private thread only on a "private" run of that same organization, and a thread restricted to named users never. Threads an agent opened, and threads whose last human reply looks like the answer, are left out. It reads up to 2,000 annotations past the agents’ own suggestions, and the summary says when older threads were not read. A page title alone in a banner, a “Coming soon” badge among real content, and stand-in lines in the header, navigation, or footer are not listed. A page behind a sign-in wall is skipped (report.skipped: "gated"), is not billed, and keeps its earlier checklist.

Context gathering strategies

Stack one or more strategies in the order you want them to run. Per-strategy overrides are supplied under contextGathering.strategyOptions["<strategy>"]. See Create Agent for the rest-api endpoint configuration schema.

Execution strategies

Knowledge (Memory-RAG)

Agents can pull workspace knowledge from Velt Memory into the prompt via execution.knowledge:
The knowledge block is strictly validated: only the four fields above are accepted. The legacy sourceIds field has been removed, and maxChunks is now capped at 20 (previously 50). Knowledge retrieval never fails an execution: if Memory is unavailable, the run continues in a degraded mode without knowledge context.

Scope

organizationId and documentId are required on Run Execution and control where annotations land. The document must already exist before you run an agent against it.

Get started

Setup

Create an agent, run it against a URL, and read the findings end-to-end.

API Reference

All endpoints organized into Agents, Execution, Versioning, Prompt Tools, Analytics, and Groups.