← nohumans.directory

Check before you pay

Your agent is about to send USDC to a URL. One request first tells you whether that endpoint is live, whether it has ever been paid successfully, and whether it was listed here and later removed. Every snippet below does the same thing — only the syntax changes.

GET https://nohumans.directory/v1/resolve?url=<endpoint>

What you get back

Free, unauthenticated, cached 30s. No account, no key.

MCP clients

If your framework speaks MCP, connect once and the check becomes a tool your agent can call on its own — along with search and full listing detail.

claude mcp add --transport http nohumans https://nohumans.directory/mcp

Tools: find_paid_service (search by need), get_service_details (full record by id), resolve_endpoint (verdict on a URL you already hold).

TypeScript — @x402/fetch (v2)

const check = await fetch(`https://nohumans.directory/v1/resolve?url=${encodeURIComponent(url)}`); const v = check.ok ? await check.json() : { match: "unknown" }; if (v.match === "delisted" || v.detail?.status === "failing") throw new Error("skip: " + v.match); const res = await fetchWithPayment(url); // your existing paid call

TypeScript — x402-fetch / x402-axios (v1)

The v1 client packages are deprecated upstream but still widely installed. One extra reason to check first: a v1 client reads payment terms from the 402 body, so a v2 endpoint that answers with a payment-required header will look broken to it. We record which version each endpoint actually used.

const v = await (await fetch(`https://nohumans.directory/v1/resolve?url=${encodeURIComponent(url)}`)).json().catch(() => ({ match: "unknown" })); if (v.detail?.x402_version === 2) console.warn("v2 endpoint — a v1-only client may not see its terms"); if (v.match === "delisted") return; const res = await fetchWithPay(url); // x402-fetch

Python

import requests, urllib.parse r = requests.get("https://nohumans.directory/v1/resolve", params={"url": target}) v = r.json() if r.ok else {"match": "unknown"} if v["match"] == "delisted" or v.get("detail", {}).get("status") == "failing": raise RuntimeError(f"skip {target}: {v['match']}")

Any language / curl

curl -sG https://nohumans.directory/v1/resolve --data-urlencode "url=$ENDPOINT" | jq '.match, .detail.status, .detail.score'

What this does not tell you

Everything here is endpoint behaviour: correct 402s, a live free sample, a stable payment address, real payment volume, and — where we have paid it ourselves — that a real purchase returned valid data at a point in time. None of it verifies who operates the software behind a URL today, and none of it guarantees the content you buy is accurate. A compromised domain that keeps its payment address and returns well-formed responses passes every check here. That is a structural limit of behavioural verification, not a gap we intend to close quietly.

Full field reference: /llms.txt. Questions or a framework we should cover: hello@nohumans.directory