HTML links

FREE with proof-of-workor $0.001 in USDCPOST /api/html-links

Enumerate every <a href> in an HTML string with its anchor text and rel attribute. Send POST /api/html-links with the required field html and pay $0.001 per call over x402 or MPP, or call it free by solving a proof-of-work challenge. It returns a JSON object with count and links.

Optionally resolves relative hrefs against a base URL and filters by a regex on the href. The deterministic way to crawl a page's outlinks without writing a regex.

Category: Web & documentsTags: html links anchor outlinks scrape

Try in playground →

Parameters

NameTypeRequiredDescription
htmlstringyesRaw HTML string to scan (max 5MB) Also accepted as content, body, markup, text, source.
basestringnoOptional base URL to resolve relative hrefs against
filterstringnoOptional regex applied to the href - only matching links are returned
limitnumbernoMax links to return, 1-1000 (default 200)
uniquebooleannoDeduplicate by href (default true)

Example request

curl -i -X POST https://agent402.tools/api/html-links \
  -H "Content-Type: application/json" \
  -d '{"html":"<a href=\"/about\">About</a><a href=\"https://example.com\">External</a>","base":"https://agent402.tools"}'

Without payment this returns HTTP 402 Payment Required with the exact price for html-links; any x402 v2 or MPP client pays it and retries.

Example response

{
  "count": 2,
  "links": [
    {
      "href": "https://agent402.tools/about",
      "text": "About",
      "rel": ""
    },
    {
      "href": "https://example.com/",
      "text": "External",
      "rel": ""
    }
  ]
}
FieldTypeAlways presentIn the example
countnumberyes2
linksarray of objectsyes2 items in the example

From an MCP client

catalog.call {
  "slug": "html-links",
  "params": {
    "html": "<a href=\"/about\">About</a><a href=\"https://example.com\">External</a>",
    "base": "https://agent402.tools"
  }
}

On the hosted connector at https://agent402.tools/mcp, catalog.call runs html-links free (rate-limited, no wallet). Local install: npx -y [email protected].

Errors and behavior

Paid call (JavaScript agent)

import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client();
client.setSpendControls?.({ maxAmountPerPayment: "$0.001" }); // refuse any quote above this tool's price
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);

const res = await payFetch("https://agent402.tools/api/html-links", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "html": "<a href=\"/about\">About</a><a href=\"https://example.com\">External</a>",
    "base": "https://agent402.tools"
  }),
});

No wallet? Pay with compute

Fetch a challenge, solve the sha256 puzzle (16 leading zero bits, a fraction of a second of CPU), and resend with the X-Pow-Solution header:

import { createHash } from "node:crypto";
const lz = (b) => { let t = 0; for (const x of b) { if (!x) { t += 8; continue; } t += Math.clz32(x) - 24; break; } return t; };
const c = await (await fetch("https://agent402.tools/api/pow/challenge?slug=html-links")).json();
let n = 0;
while (lz(createHash("sha256").update(c.challenge + ":" + n).digest()) < c.difficulty) n++;
await fetch("https://agent402.tools/api/html-links", { method: "POST", headers: { "X-Pow-Solution": c.token + ":" + n, "Content-Type": "application/json" }, body: JSON.stringify({"html":"<a href=\"/about\">About</a><a href=\"https://example.com\">External</a>","base":"https://agent402.tools"}) });

Part of these workflows

HTML links is one step in these 2 skill packs, each sold as a single call:

Related tools

HTML select

FREE w/ compute · or $0.001 · POST /api/html-select

Run a CSS selector against an HTML string and return the matches (text, attrs, and optionally outerHTML for each).

HTML table to JSON/CSV

FREE w/ compute · or $0.001 · POST /api/html-table

Extract a <table> from an HTML string as JSON rows (header-keyed) or CSV.

Email guard

FREE w/ compute · or $0.001 · POST /api/email-guard

Read one email the way an agent that triages mail should before acting on it: observations with evidence and offsets, no.

Hidden text scan

FREE w/ compute · or $0.001 · POST /api/hidden-text-scan

Check an email or web page for text a person reading it would not see but an AI reading it would: HTML comments.

HTML frames (render contract, frame check)

from $0.02 · POST /api/html-frames

Freeze frames of an animation under the render contract: the page defines window.renderAt(t).

HTML meta (from string)

FREE w/ compute · or $0.001 · POST /api/html-meta

Extract <title>, <meta description>, OpenGraph/Twitter cards, canonical URL, and JSON-LD blocks from an HTML string.