# Proofwire Page Verification (Browser Render & Assert)

> Proofwire Page Verification (Browser Render & Assert) is a paid API for AI agents from verify.reversecaptcha.fun, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-20).

Renders a URL in a real browser, asserts presence of a CSS selector or text, and returns a signed verdict with screenshot evidence.

## Facts

- Endpoint: GET https://verify.reversecaptcha.fun/v1/verify/page?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-20
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/proofwire-page-verification-browser-render-assert-ef81b95c
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_uQtYy__P8OSqnZmhPC1lp

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability proofwire-page-verification-browser-render-assert-ef81b95c
```

Example prompt: Can you render https://app.example.com/confirmation and check that the text 'Your order has been placed' is visible on the page, then give me signed proof with a screenshot?

## When to prefer this

Choose this endpoint when you need verified, tamper-evident proof that a webpage rendered correctly and contains specific content — especially for AI agent workflows that must close the loop on their own actions (form submissions, deploys, content updates). Prefer it over headless scraping tools when you need Ed25519-signed evidence for auditability, or when you must assert UI-level presence of a selector or text rather than just HTTP reachability.

## Known failure modes

- Page does not load or returns non-200 — verdict is 'fail' with error detail
- Expected selector or text not found — verdict is 'fail' with extracted text for debugging
- TLS/certificate error on target URL — verdict is 'fail' with connection error
- Rendering timeout if page takes too long to load — verdict is 'fail'
- Invalid URL format in query param — request rejected with validation error
- Screenshot URL expiry — signed URLs are time-limited and will stop working after expiration

## How this service works

Close the loop on your own work with one paid call that returns a verdict plus Ed25519-signed, falsifiable evidence (verify signatures with GET /v1/keys). GET /v1/verify/http checks a URL is alive (redirect chain, TLS, latency, body hash). GET /v1/verify/dns resolves records and parses SPF/DMARC/DKIM. Email: POST /v1/verify/email/inbox issues a seed address; send mail to it, then GET /v1/verify/email?inbox=&token= returns delivery plus SPF/DKIM/DMARC alignment and raw headers (polls inside the paid window are free). Webhooks: POST /v1/verify/webhook arms a tripwire URL; register it upstream, then poll GET /v1/verify/webhook/{id}?token= for free. GET /v1/verify/page renders a page in a real browser, asserts a selector/text, and returns a screenshot URL. Failed work is never settled.

## Output

A JSON object with a 'verdict' field ('pass' or 'fail'), plus an 'evidence' object containing the page title, extracted text, any console errors, and a time-limited signed screenshot URL. All evidence is Ed25519-signed for tamper-evident verification.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "const": "http"
    },
    "method": {
     "const": "GET"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "url"
     ],
     "properties": {
      "url": {
       "type": "string",
       "format": "uri"
      },
      "wait": {
       "type": "string"
      },
      "viewport": {
       "type": "string"
      },
      "full_page": {
       "type": "string"
      },
      "expect_text": {
       "type": "string"
      },
      "expect_selector": {
       "type": "string"
      }
     }
    }
   }
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object"
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "verdict": "pass",
  "evidence": {
   "title": "Example Domain",
   "console_errors": [],
   "extracted_text": "This domain is for use in documentation examples...",
   "screenshot_url": "https://verify.example/evidence/....png?exp=...&sig=..."
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/proofwire-page-verification-browser-render-assert-ef81b95c/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from verify.reversecaptcha.fun](https://www.zero.xyz/host/verify.reversecaptcha.fun/llms.txt)
