# Page Change Fingerprint

> Page Change Fingerprint is a paid API for AI agents from scrooge-x402-tool-mill.vercel.app, paid per call via x402, $0.04/call, status unknown (last checked 2026-10-02).

Fetches a public URL and returns a stable fingerprint (ETag, Last-Modified, SHA-256 content hash, byte length, and fetch timestamp) for detecting future changes

## Facts

- Endpoint: GET https://scrooge-x402-tool-mill.vercel.app/v1/change-fingerprint?utm_source=zero.xyz
- Price: $0.04/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-02
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/page-change-fingerprint-5c649cf9
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_IE3ZsWQGqh6Gz-pkp3R91

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 page-change-fingerprint-5c649cf9
```

Example prompt: Can you fingerprint https://example.com/pricing so I can tell later if the page content or headers have changed — give me the SHA-256 hash, ETag, Last-Modified, and byte size?

## When to prefer this

Choose this endpoint when you need a lightweight, deterministic signal to detect whether a public webpage has changed — without downloading or storing the full page content. It is ideal for polling loops, change-alert pipelines, or audit trails where you want to compare a current fingerprint against a stored baseline. Prefer it over full-page extraction endpoints when you only need to know *if* content changed, not *what* changed.

## Known failure modes

- Private or link-local hosts (e.g. localhost, 192.168.x.x) are blocked with an SSRF-safe error
- Non-HTTP/HTTPS URLs are rejected
- Unreachable or down URLs return a fetch error
- Payment of $0.04 USDC on Base must succeed before the request is processed; payment failure blocks execution
- Pages with no visible text produce a hash of empty/normalized content
- Very large pages may hit byte or timeout limits

## How this service works

Fingerprint a public page so agents can detect changes: final url, etag, lastModified, sha256 contentHash of normalized visible text, raw byteLength, and fetchedAt. POST JSON {"url":"https://example.com"}. Public http(s) only; private hosts blocked. $0.04 USDC on Base (eip155:8453). No API key.

## Output

A JSON object containing: the final URL after redirects, the ETag header (or null), the Last-Modified header (or null), a SHA-256 hex digest of the normalized visible text content, the raw byte length of the upstream response, and an ISO-8601 timestamp of when the page was fetched.

## 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",
     "properties": {
      "url": {
       "type": "string",
       "format": "uri",
       "description": "Public http(s) URL to fetch (SSRF-safe; private/link-local blocked)"
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "url",
      "etag",
      "lastModified",
      "contentHash",
      "byteLength",
      "fetchedAt"
     ],
     "properties": {
      "url": {
       "type": "string",
       "format": "uri",
       "description": "Final URL after redirects"
      },
      "etag": {
       "type": [
        "string",
        "null"
       ],
       "description": "Upstream ETag header, or null"
      },
      "fetchedAt": {
       "type": "string",
       "format": "date-time",
       "description": "ISO-8601 time the page was fetched"
      },
      "byteLength": {
       "type": "integer",
       "minimum": 0,
       "description": "Raw upstream response size in bytes"
      },
      "contentHash": {
       "type": "string",
       "pattern": "^[a-f0-9]{64}$",
       "description": "sha256 hex of normalized visible text"
      },
      "lastModified": {
       "type": [
        "string",
        "null"
       ],
       "description": "Upstream Last-Modified header, or null"
      }
     },
     "additionalProperties": false
    }
   }
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/page-change-fingerprint-5c649cf9/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from scrooge-x402-tool-mill.vercel.app](https://www.zero.xyz/host/scrooge-x402-tool-mill.vercel.app/llms.txt)
