# Scrooge X402 Link Graph Extractor

> Scrooge X402 Link Graph Extractor is a paid API for AI agents from scrooge-x402-tool-mill.vercel.app, paid per call via x402, $0.03/call, status unknown (last checked 2026-10-02).

Extracts the outbound link graph of a public HTML page, returning the final URL, page title, unique links with anchor text, and total link count.

## Facts

- Endpoint: GET https://scrooge-x402-tool-mill.vercel.app/v1/link-graph?utm_source=zero.xyz
- Price: $0.03/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-02
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/scrooge-x402-link-graph-extractor-d198fdb6
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_gRI6IJbjMWrVZSNlx1ET6

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 scrooge-x402-link-graph-extractor-d198fdb6
```

Example prompt: Can you pull all the outbound links from https://news.ycombinator.com — give me the href and anchor text for each one, up to 50 links?

## When to prefer this

Choose this endpoint when you need to enumerate outbound hyperlinks from a specific public HTML page, especially for SEO audits, content graph mapping, or link discovery workflows. It is purpose-built for link extraction with anchor text, unlike general page scrapers that return raw HTML or plain text. Prefer it over full-page content extractors when you specifically need href/anchor-text pairs rather than readable body text.

## Known failure modes

- Private or link-local URLs (e.g. 192.168.x.x, localhost) are blocked for SSRF safety
- Non-public or non-http(s) URLs will be rejected
- Pages with no outbound links return count: 0 and empty links array
- Heavily JavaScript-rendered pages may return fewer links than expected (static HTML only)
- maxLinks values outside 1–50 are clamped to the valid range
- Payment failure results in 402 response requiring 0.03 USDC on Base

## How this service works

Extract the outbound link graph of a public HTML page: final url, title, unique links as {href, text?}, and count. POST JSON {"url":"https://example.com","maxLinks":50}. Optional maxLinks is an integer 1–50 (default 50). Skips #, javascript, mailto, tel, and data links. Public http(s) only. $0.03 USDC on Base (eip155:8453). No API key.

## Output

Returns a JSON object with: `url` (final URL after redirects), `title` (HTML page title or null), `links` (array of up to 50 objects each with `href` and optional `text` anchor), and `count` (total number of unique links returned). Fragment (#), javascript:, mailto:, tel:, and data: links are excluded.

## 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)"
      },
      "maxLinks": {
       "type": "string",
       "description": "Optional maxLinks query string (1–50; handler clamps)"
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "url",
      "title",
      "links",
      "count"
     ],
     "properties": {
      "url": {
       "type": "string",
       "format": "uri",
       "description": "Final URL after redirects"
      },
      "count": {
       "type": "integer",
       "maximum": 50,
       "minimum": 0,
       "description": "links.length"
      },
      "links": {
       "type": "array",
       "items": {
        "type": "object",
        "required": [
         "href"
        ],
        "properties": {
         "href": {
          "type": "string",
          "format": "uri",
          "description": "Absolute link URL"
         },
         "text": {
          "type": "string",
          "maxLength": 200,
          "description": "Anchor text; omitted when empty"
         }
        },
        "additionalProperties": false
       },
       "maxItems": 50
      },
      "title": {
       "type": [
        "string",
        "null"
       ],
       "description": "HTML title, or null"
      }
     },
     "additionalProperties": false
    }
   }
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/scrooge-x402-link-graph-extractor-d198fdb6/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)
