MERCURY
UniversityDocsVerifyCited Notarize

Mercury · Cited Notarize

Verify$0.008 / callLivex402API key

GET /buy/notarize

What it does

Notarize any content (inline ?content= or a fetched ?url=) into a signed, offline-verifiable provenance receipt — sha256 contentHash + witnessed timestamp, attested by Mercury's pinned key. Deterministic, keyless, no LLM. The signed receipt is the product: it witnesses that these exact bytes existed in this exact form at this time (the one thing your own sha256() can't — a third-party witness).

The goal it serves: produce audit-grade evidence: a deterministic verdict bound to exact bytes, signed by the pinned key, so anyone can check it offline, forever — no callback to Mercury required.

Schemas & output preview

Input schema — the exact request shape the route validates.

json · input schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "description": "a page (http/https) to fetch + notarize its cleaned text. Provide EITHER url OR content, not both."
    },
    "content": {
      "type": "string",
      "maxLength": 262144,
      "description": "inline content (UTF-8, ≤256KB) to notarize directly — bytes you already hold. Provide EITHER url OR content, not both."
    }
  },
  "required": [],
  "additionalProperties": false
}

Output schema — the exact response shape the handler returns.

json · output schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "true on success; false on an honest failure (never charged)"
    },
    "url": {
      "type": "string",
      "description": "echo of the notarized source identifier (the url, or 'inline:content')"
    },
    "status": {
      "type": "integer",
      "description": "200 on success; upstream status when a fetched url failed"
    },
    "text": {
      "type": "string",
      "description": "the CANONICAL notarization statement — the exact string the seller's EIP-191 receipt signs over. Newline-joined, fixed field order, reconstructable byte-for-byte for offline verification."
    },
    "data": {
      "type": "object",
      "description": "the structured notarization record the buyer consumes",
      "properties": {
        "algorithm": {
          "type": "string",
          "description": "the content-hash algorithm (sha256)"
        },
        "contentHash": {
          "type": "string",
          "description": "0x… sha256 hex of the exact notarized bytes"
        },
        "byteLength": {
          "type": "integer",
          "description": "byte length of the notarized content (UTF-8)"
        },
        "source": {
          "type": "string",
          "description": "where the content came from: the final url, or 'inline:content'"
        },
        "sourceKind": {
          "type": "string",
          "enum": [
            "url",
            "inline"
          ],
          "description": "url = fetched; inline = buyer-supplied"
        },
        "witnessedAt": {
          "type": "string",
          "description": "ISO-8601 time Mercury witnessed (== fetchedAt of the read)"
        },
        "statementVersion": {
          "type": "string",
          "description": "versioned notarization scheme id"
        },
        "verify": {
          "type": "object",
          "description": "how to verify OFFLINE without Mercury's SDK",
          "properties": {
            "howTo": {
              "type": "string"
            },
            "wellKnown": {
              "type": "string",
              "description": "where the witness key is publicly pinned"
            }
          }
        }
      },
      "additionalProperties": false
    },
    "fetchedAt": {
      "type": "string",
      "description": "ISO-8601 witness time (mirrors data.witnessedAt)"
    },
    "error": {
      "type": "string",
      "description": "present only when ok:false"
    }
  },
  "required": [
    "ok",
    "url"
  ],
  "additionalProperties": false
}

Output preview — a real example response, shown free (you only pay when you call the route).

json · output preview
{
  "ok": true,
  "url": "inline:content",
  "status": 200,
  "text": "mercury-x402:notarize:v1\nalgorithm=sha256\ncontentHash=0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824\nbyteLength=5\nsource=inline:content\nwitnessedAt=2026-06-04T00:00:00.000Z\ndomain=mercury-x402",
  "data": {
    "algorithm": "sha256",
    "contentHash": "0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
    "byteLength": 5,
    "source": "inline:content",
    "sourceKind": "inline",
    "witnessedAt": "2026-06-04T00:00:00.000Z",
    "statementVersion": "mercury-x402:notarize:v1",
    "verify": {
      "howTo": "recompute sha256(your content) and confirm it equals data.contentHash; then EIP-191 ecrecover the spliced `attestation.signature` over `text` and confirm the signer equals the witness address pinned at /.well-known/mercury-attestation.",
      "wellKnown": "/.well-known/mercury-attestation"
    }
  },
  "fetchedAt": "2026-06-04T00:00:00.000Z"
}

Pay & call

Your agent calls the route; the 402 challenge carries the exact price ($0.008, USDC on Base mainnet); the x402 client settles via the CDP facilitator and retries. No key, no signup.

agent.mjs · x402
import { wrapFetchWithPayment } from "x402-fetch";
const pay = wrapFetchWithPayment(fetch, account); // viem account holding a little USDC on Base
const res = await pay("https://network.mercury-hq.com/buy/notarize?url=https://example.com");
const out = await res.json(); // the result + `attestation` (the signed receipt)

Prepaid alternative — the same route accepts an API key:

bash · API key
# Same route, prepaid API-key rail (Bearer mk_live_…) — get a key at https://network.mercury-hq.com/developers
curl -H "Authorization: Bearer mk_live_YOURKEY" "https://network.mercury-hq.com/buy/notarize?url=https://example.com"
Pay over 402 — get the missing pieceEvery paid call returns an EIP-191 signed receipt — verify it free at /x402/verify.

Verify the receipt

Recover the EIP-191 signature over sha256(content)‖url‖status‖fetchedAt‖nonce and confirm the signer equals the pinned attestation key 0xACB40253BD71Bb9a5d491b2c6EFF755F2A33Fc75 (published at /.well-known/mercury-attestation). No callback to Mercury — the receipt verifies offline, forever. Verification is always free: POST the receipt to /x402/verify or run ecrecover yourself.

FactValue
Attestation signer (pinned)0xACB40253BD71Bb9a5d491b2c6EFF755F2A33Fc75
Key published at/.well-known/mercury-attestation
Live verifier (free)/x402/verify
Settlementreal USDC on Base mainnet (eip155:8453) via CDP — auditable on BaseScan
URL + prior content-hash (or prior text) -> refetch, deterministic change-proof: changed? + a NEW signed receipt binding fromHash->toHash. Stateless;…
Open
URL (a JSON/API endpoint) + a JSON Schema in → a deterministic pass/fail with per-field errors (missing/wrong-type/enum/range/pattern), plus a signed…
Open

More: all services · /catalog · the headline web-fetch · agent twin of this page: GET /university/docs/cited-notarize?format=md