# Web Change-Detection Monitor (x402)

> Web Change-Detection Monitor (x402) is a paid API for AI agents from assetfactory-jobs-x402.sigrunner.workers.dev, paid per call via x402, $0.003/call, status unknown (last checked 2026-11-01).

Fetches up to 10 public URLs live and returns compact content fingerprints (hashes + counts), plus a change verdict and category diff when a prior fingerprint is supplied.

## Facts

- Endpoint: GET https://assetfactory-jobs-x402.sigrunner.workers.dev/web/monitor?utm_source=zero.xyz
- Price: $0.003/call
- Payment: x402
- Status: unknown
- Last checked: 2026-11-01
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/web-change-detection-monitor-x402-def1582e
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_kpL7K8M7SABV9hq3V2reN

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 web-change-detection-monitor-x402-def1582e
```

Example prompt: Check openai.com/pricing and stripe.com/pricing for any changes since my last fingerprints — here's the prior snapshot: {"https://openai.com/pricing":"0a080719be9fbb82a86a45b80dc8c2a4","https://stripe.com/pricing":"b3f1c22a91de4e7f"} — and tell me if content, headings, or title changed on either.

## When to prefer this

Choose this endpoint when you need a stateless, lightweight change-detection primitive that the agent manages: you store the fingerprints, the service holds no state. Ideal for polling loops where you want to know WHAT category changed (content vs headings vs title vs status) without storing or transmitting the full page body. Prefer over full-scrape endpoints when privacy, payload size, or statelessness matters. Use when monitoring up to 10 URLs per call on a scheduled basis with no server-side subscription required.

## Known failure modes

- URL is unreachable or returns non-2xx without redirect — record marked ok:false with status code
- SSRF guard blocks private/internal IP ranges — request rejected
- More than 10 URLs submitted — excess URLs ignored or error returned
- Malformed base64 in since parameter — diff skipped or error returned
- Target page behind authentication or bot-detection blocks fetch — returns failed record
- Network timeout on slow pages — record marked failed

## How this service works

One maintained, normalized jobs data API that scrapes open job postings and listings across 10 applicant-tracking systems (Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Recruitee, Workable, BambooHR, Breezy, Personio) with company-domain auto-detection. Use it to list a company’s open roles, find remote software-engineering / sales / any jobs, detect whether a company is hiring, and pull recruiting, salary and requirements data. Pay per call in USDC on Base via x402 (HTTP 402) — no account, no API key. Adapters are drift-monitored and maintained so the feed does not rot.

## Output

A JSON object containing a records array (one entry per URL) with: ok status, HTTP status code, final URL after redirects, checked_at timestamp, a fingerprint object (content_hash, headings_hash, word_count, heading_count, link_count, title), and — when a prior fingerprint was supplied — a diff object with boolean flags (content_changed, headings_changed, title_changed, status_changed) and word_count_delta plus a top-level changed boolean. Also includes aggregate stats (ok, failed, changed, baseline, unchanged counts) and a generated_at timestamp.

## 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": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "urls"
     ],
     "properties": {
      "urls": {
       "type": "string",
       "description": "Comma-separated page URLs to check for changes (up to 10). Each is fetched LIVE and reduced to a compact content fingerprint (hashes + counts, never the body). Watch a pricing page, docs changelog, status page, job board or a competitor's site and be told WHAT changed since you last looked."
      },
      "since": {
       "type": "string",
       "description": "Optional base64-encoded JSON object mapping each url to the prior fingerprint returned by a previous call (or a bare prior content_hash string). Supply it to get a changed verdict + category diff; omit it to establish a baseline to store. STATELESS — the agent holds the fingerprints, the service holds no snapshot."
      },
      "ignore": {
       "type": "string",
       "description": "Optional pipe-separated CSS selectors dropped before fingerprinting (cookie banner, last-updated stamp)."
      },
      "pointer": {
       "type": "string",
       "description": "JSON endpoints: optional RFC-6901 JSON-Pointer scoping the structured diff to a subtree (e.g. /paths for OpenAPI)."
      },
      "maxChars": {
       "type": "integer",
       "default": 40000,
       "maximum": 200000,
       "description": "Per-URL ceiling on the text region fingerprinted."
      },
      "selector": {
       "type": "string",
       "description": "Optional CSS selector scoping the watch to one region of the page (price table, changelog list)."
      },
      "ignoreText": {
       "type": "string",
       "description": "Optional '|||'-separated regexes blanked from the text before hashing (timestamps, counters)."
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object"
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "count": 1,
  "stats": {
   "ok": 1,
   "failed": 0,
   "changed": 1,
   "baseline": 0,
   "requested": 1,
   "unchanged": 0
  },
  "records": [
   {
    "ok": true,
    "url": "https://openai.com/pricing",
    "diff": {
     "title_changed": false,
     "status_changed": false,
     "content_changed": true,
     "headings_changed": false,
     "word_count_delta": 14
    },
    "title": "Pricing",
    "status": 200,
    "changed": true,
    "final_url": "https://openai.com/pricing",
    "checked_at": "2026-10-31T00:00:00.000Z",
    "fingerprint": {
     "title": "Pricing",
     "status": 200,
     "link_count": null,
     "word_count": 512,
     "content_hash": "0a080719be9fbb82a86a45b80dc8c2a4",
     "heading_count": 8,
     "headings_hash": "e3b0c44298fc1c149afbf4c8996fb924"
    }
   }
  ],
  "generated_at": "2026-10-31T00:00:00.000Z"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/web-change-detection-monitor-x402-def1582e/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from assetfactory-jobs-x402.sigrunner.workers.dev](https://www.zero.xyz/host/assetfactory-jobs-x402.sigrunner.workers.dev/llms.txt)
