MERCURY
UniversityDocsExtractCited Links

Mercury · Cited Links

Extract$0.005 / callLivex402API key

GET /buy/links

What it does

URL → a SIGNED outbound/internal link graph: every <a href> as an absolute URL + anchor text, classified internal vs external against the page origin, grouped by origin with a third-party-origin histogram (privacy-audit) and same/cross-origin counts (SEO). Deterministic — same page bytes ⇒ byte-identical graph; no LLM. Covers <a> hyperlinks only (not rel/asset tags). Receipt = EIP-191 over the graph.

The goal it serves: turn a page into a typed record an agent can act on, with the signed receipt proving the fields are exactly what Mercury resolved from the source — deterministic, keyless, no LLM.

Schemas & output preview

Input schema — the exact request shape the route validates.

json · input schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "description": "the page to map (http/https)"
    }
  },
  "required": [
    "url"
  ],
  "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 (still delivered)"
    },
    "url": {
      "type": "string",
      "description": "final URL after redirects (the graph origin)"
    },
    "status": {
      "type": "integer",
      "description": "upstream HTTP status"
    },
    "data": {
      "type": "object",
      "description": "the structured link graph (the product the buyer consumes)",
      "properties": {
        "pageOrigin": {
          "type": "string",
          "description": "scheme://host of the final page — the reference origin"
        },
        "total": {
          "type": "integer",
          "description": "number of unique outbound <a href> links"
        },
        "internalCount": {
          "type": "integer",
          "description": "links to the same registrable host (www-insensitive)"
        },
        "externalCount": {
          "type": "integer",
          "description": "links to a different host"
        },
        "originCount": {
          "type": "integer",
          "description": "number of distinct link origins"
        },
        "links": {
          "type": "array",
          "description": "every link: absolute url, anchor text, its origin, and internal/external",
          "items": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string"
              },
              "text": {
                "type": "string",
                "description": "anchor text (may be empty for image/icon links)"
              },
              "origin": {
                "type": "string",
                "description": "scheme://host of this link"
              },
              "internal": {
                "type": "boolean",
                "description": "true if same registrable host as the page"
              }
            }
          }
        },
        "byOrigin": {
          "type": "array",
          "description": "links grouped by origin, descending by count (SEO + competitor map)",
          "items": {
            "type": "object",
            "properties": {
              "origin": {
                "type": "string"
              },
              "count": {
                "type": "integer"
              },
              "internal": {
                "type": "boolean"
              }
            }
          }
        },
        "thirdPartyOrigins": {
          "type": "array",
          "description": "distinct EXTERNAL origins only — the privacy-audit / data-leak surface",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "text": {
      "type": "string",
      "description": "canonical newline string the signed receipt covers (one `text\\turl` row per link, origin-sorted)"
    },
    "contentType": {
      "type": "string"
    },
    "fetchedAt": {
      "type": "string",
      "description": "ISO8601 fetch time (in the signed payload)"
    },
    "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": "https://example.com/",
  "status": 200,
  "data": {
    "pageOrigin": "https://example.com",
    "total": 1,
    "internalCount": 0,
    "externalCount": 1,
    "originCount": 1,
    "links": [
      {
        "url": "https://www.iana.org/domains/example",
        "text": "More information...",
        "origin": "https://www.iana.org",
        "internal": false
      }
    ],
    "byOrigin": [
      {
        "origin": "https://www.iana.org",
        "count": 1,
        "internal": false
      }
    ],
    "thirdPartyOrigins": [
      "https://www.iana.org"
    ]
  },
  "text": "More information...\thttps://www.iana.org/domains/example",
  "contentType": "text/html; charset=utf-8",
  "fetchedAt": "2026-06-04T00:00:00.000Z"
}

Pay & call

Your agent calls the route; the 402 challenge carries the exact price ($0.005, 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/links?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/links?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
RSS/Atom feed URL → a SIGNED, normalized item list [{title,link,published,summary}] unified across RSS 2.0/RDF + Atom 1.0: CDATA unwrapped, HTML…
Open
URL → one typed, SIGNED metadata record (JSON-LD + OpenGraph + Twitter-card + standard <meta> + canonical + title), by source. Deterministic,…
Open
URL in → the page's main HTML <table>(s) parsed into typed, header-keyed rows (JSON) + clean RFC-4180 CSV, with a signed provenance receipt over the…
Open
TYPED structured extract for autonomous agents — URL + schema → a clean, type-safe JSON record. Where /buy/fetch returns page TEXT (and ?extract=…
Open

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