Built for agents · x402 · Base mainnet (eip155:8453)

Scrooge Tool Mill

Pay-per-call JSON APIs for agents. No API keys. Call → get 402 → pay USDC via x402 → get structured page data.

Base MAINNET: Production settles on Base mainnet (eip155:8453) in USDC — not Sepolia.
Start here · cheapest first call

POST /v1/page-meta · $0.02 USDC

Title, description, canonical, OG, language, excerpt. Network eip155:8453 · pay to 0xfE2353C808F2409cCb81508005A62cef29457706. Free sample: GET /start. Agent start: GET /agent-start.json. Unpaid 402s: GET /stats (durable KV counter; zeros only if no store). Bazaar: unpaid 402 includes extensions.bazaar so Coinbase can index after one paid settle.

1) Probe (expect HTTP 402)

curl -sS -i -X POST https://scrooge-x402-tool-mill.vercel.app/v1/page-meta \
  -H 'content-type: application/json' \
  -d '{"url":"https://example.com"}'

2) Pay with @x402/fetch (Base mainnet USDC)

import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";

const account = privateKeyToAccount(process.env.PRIVATE_KEY);
const fetchPaid = wrapFetchWithPaymentFromConfig(fetch, {
  schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],
});
const res = await fetchPaid("https://scrooge-x402-tool-mill.vercel.app/v1/page-meta", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({ url: "https://example.com" }),
});
// HTTP 200 → { url, title, description, ... }

Expected 200 shape: { url, title?, description?, canonical?, og?, language?, excerpt? } (fields present when the page exposes them).

Live: https://scrooge-x402-tool-mill.vercel.app
Network: Base mainnet (eip155:8453) · Scheme: exact
Pay to: 0xfE2353C808F2409cCb81508005A62cef29457706

Also available

POST /v1/readable-text

Readable text $0.05 USDC

Main article text. Optional maxChars (cap 12000).

POST /v1/link-graph

Link graph $0.03 USDC

Outbound {href,text?} (max 50).

POST /v1/change-fingerprint

Change fingerprint $0.04 USDC

etag, lastModified, sha256 contentHash, byteLength, fetchedAt.

POST /v1/batch-meta

Batch meta $0.15 USDC

Up to 10 URLs → {results:[{url,ok,meta|error}]}.

x402: Unpaid calls return HTTP 402 with PAYMENT-REQUIRED. Sign with @x402/fetch, retry with PAYMENT-SIGNATURE.
Free discovery

Machine-readable catalog

GET /.well-known/l402-services (canonical) · GET /.well-known/x402-services · GET /openapi-x402.json. Thin GET on paid paths returns the same 402 challenge; POST is the workhorse.