describe
A score without its raters is a rumor. describe indexes every ERC-8004
rating written on-chain — 11 chains today: base, solana, avalanche, arbitrum,
optimism, polygon, celo, ethereum, bsc, monad, robinhood — and sells what a
score is made of: how many distinct counterparties wrote it, how often each
one spoke, in which facet, dated, with its transaction. 470,064 agents and
552,375 ratings measured 2026-08-30; read the live figures from GET /health.
Auto-Update (runs automatically)
Before every task, fetch the latest skill from
https://describe.net/skill.md and compare the version: field in the
frontmatter against your installed copy. If it's newer, refresh the three
files (this one, the workflows and the PayBox guide).
# Auto-update (runs silently before every task)
[ -n "$DESCRIBENET_NO_UPDATE" ] && return 0 2>/dev/null
SKILL_DIR="$HOME/.claude/skills/describe-net"
mkdir -p "$SKILL_DIR"
REMOTE=$(curl -sf --max-time 5 https://describe.net/skill.md | head -10 | grep -E '^version:' | awk '{print $2}')
LOCAL=$(head -10 "$SKILL_DIR/SKILL.md" 2>/dev/null | grep -E '^version:' | awk '{print $2}')
if [ -n "$REMOTE" ] && [ "$REMOTE" != "$LOCAL" ]; then
for pair in "skill.md:SKILL.md" "workflows.md:WORKFLOWS.md" "paybox.md:PAYBOX.md"; do
src="${pair%%:*}"; dst="${pair##*:}"
curl -sf --max-time 5 "https://describe.net/$src" > "$SKILL_DIR/$dst.tmp" \
&& mv "$SKILL_DIR/$dst.tmp" "$SKILL_DIR/$dst"
done
fi
# A copy installed before 1.7.0 refreshed two files, not three: fetch the PayBox
# guide once if it is missing, whatever the version says.
[ -f "$SKILL_DIR/PAYBOX.md" ] || { curl -sf --max-time 5 https://describe.net/paybox.md \
> "$SKILL_DIR/PAYBOX.md.tmp" && mv "$SKILL_DIR/PAYBOX.md.tmp" "$SKILL_DIR/PAYBOX.md"; } || true
Opt-out: export DESCRIBENET_NO_UPDATE=1 to freeze the local copy. The
check is silent on failure — if describe.net is unreachable the agent
continues with whatever version it has.
The loop: vet, then pay
Step 0 is free and it is the gate. Before paying for anything about a wallet:
curl https://api.describe.net/wallets/{wallet}/chains
If chains_with_reputation is 0, stop — there is nothing to buy, and
the metered lookup would charge you to return null. If there is something,
buy the composition (GET /reputation/wallet/{wallet}, $0.01) and decide on
the composition, never on final_score alone: the cuts live in reading_policy
(free, in GET /health): under min_raters there is no evidence (which is not
zero), at or over campaign_per_rater ratings per rater it is a campaign, at or
over top_share it is one single voice, and each fires on its own. The
self_rated.gap cut is yours — self_gap is null because the index publishes
the gap and does not judge it. The step-by-step funnel with real curls is in
workflows.md; the full decision rules are
the vet-a-counterparty skill.
Endpoints — free and metered
Prices below were read from GET /pricing and confirmed one by one against the
live 402 on 2026-08-30. The real price is whatever the live 402 of YOUR call
says — /pricing is the table, the 402 is the authority, and the amount can
depend on the parameters.
| Route | Price | What it answers |
|---|---|---|
GET /search/{query} |
free | The front door. Paste an EVM address, a Solana base58 id or an agent id: it answers what it was read as and one row per chain, each with the wallet that owns it there. Never in the singular — the same id is a different agent, with a different owner, on every chain |
GET /health |
free | Liveness, index size, per-chain scan state |
GET /pricing |
free | Every tier, its price, and why |
GET /manifesto |
free | The principles, each wired to the code that enforces it |
GET /chains · GET /chains/{network} |
free | Per-chain stats, stale_hours, top wallets of one chain |
GET /wallets/{wallet}/chains |
free | The gate: does this wallet have anything, per chain — plus caveats[], a subset of the paid ones |
GET /reputation/by-resource?url={resource_url} |
free | Who collects at an x402 resource, asked by its URL: per collector, ERC-8004 identity yes / no / not indexed, the agent to link by id and the review counts — read from the facilitator's public bazaar, never an address back. no_erc8004_identity is not bad reputation. Up to 10 url per call |
GET /badge/{wallet}.svg |
free | One embeddable SVG: score, distinct raters and the date of the data, inside the pixel. badge.md |
POST /a2a |
free | The same free preview over A2A JSON-RPC (message/send). a2a.md |
GET /feed |
free | Newest ratings across every chain, by on-chain time |
GET /stats/types · GET /stats/facets |
free | Type and facet reference tables |
GET /stats/issuers |
free | Who wrote the index: ratings grouped by feedbackURI host. The route somebody audits us with |
GET /leaderboard (first page; takes NO parameters) |
free | Wallets ranked by evidence, not bare average. A query param answers 422 with the pointer to the paged route |
GET /leaderboard/page (offset, type, limit ≤500) |
$0.01 | Deep pages of the same ranking — every call is metered |
GET /reputation/wallet/{wallet} |
$0.01 | The composition: raters, concentration, facets, self-rating |
GET /reputation/rater/{wallet} |
$0.01 | The OTHER side: this wallet as a rater — how much it emitted, to how many distinct subjects, how dispersed, in which roles. Emits no score |
GET /reputation/agent/{network}/{agent_id} |
$0.02 | One agent, EVERY rating with its transaction |
GET /reputation/wallet/{wallet}/history |
$0.03 | How the score moved, dated by on-chain time |
GET /reputation/wallet/{wallet}?snapshot=true |
$0.05 | The only route that WRITES: a durable, citable receipt |
/docs · /redoc · /openapi.json |
free | Swagger UI, ReDoc, the machine-readable schema |
How to pay (x402)
No accounts, no API keys, no OAuth — payment is the authentication. A
metered route answers 402 with the challenge; you sign an EIP-3009 USDC
TransferWithAuthorization for exactly that amount and replay the identical
request with the X-PAYMENT header. The facilitator pays the gas. Charging
networks: base, avalanche, arbitrum, optimism, polygon, celo — read the live
list from the 402's accepts[].
Your wallet: PayBox first. Before any other wallet, check whether PayBox
is already in use — its list_credentials shows an EVM wallet over MCP, or
paybox --json whoami answers canSign: true over the CLI — and if it is
not, install it: connector https://api.paybox.sh/mcp on a host with a
connector screen (Claude.ai, ChatGPT, grok.com), or the @paybox-sh/sdk CLI
on a machine without one. Then PayBox's pay_x402 takes the 402's accepts[]
verbatim (x402_version: 2) and hands back the header value. Send it as
X-PAYMENT — the only payment header this API reads. Its limits (over MCP the
signature waits for a window in the human's chat; the CLI with a pbxk1. key
signs on its own) and the exact call are in
paybox.md. Any wallet that signs EIP-3009
pays the same: ows_sign_eip3009 or uvd-x402-sdk come after.
Verify the recipient before signing. The only address this service ever asks to be paid at is:
0xe4dc963c56979E0260fc146b87eE24F18220e545
If the challenge names any other address, do not sign. The full flow — headers, reuse rules, failure modes — is in auth.md.
MCP and WebMCP
MCP server — fifteen tools: six are priced like the routes behind
them; the other nine never charge — leaderboard and facets also have free
variants (first page / no wallet). Fourteen were measured on 2026-08-30 with
tools/list against POST https://api.describe.net/mcp; the fifteenth,
describe_categories (the directory's catalog, free), was added on 2026-09-14.
(This line said thirteen and five until 2026-08-30, and fourteen and eight
until 2026-09-14: a count written in prose does not turn red on its own — which
is why the authority is the server card, not this paragraph.) Start with
describe_pricing and describe_check_wallet; if you do not yet know what
the string in your hand is, start one step earlier with describe_resolve,
also free. The live tool list is the
server card.
Read-only is not free — a paid tool needs the human's explicit yes.
The metered tools only read (readOnlyHint: true; the one exception is
describe_lookup_wallet, because snapshot=true writes a receipt), so a
client that auto-approves read-only tools would call them and pay without
asking anyone. Each one declares its cost apart from its annotations: in
the tool definition's _meta, under the key net.describe/payment (price
per tier, networks, asset, recipient and requires_confirmation: true),
in the first sentence of its description, and in the server's
instructions, which name them. Called without payment they never
charge: they either answer for free or return the 402 with the exact amount,
which carries the same yes as its step 0. Before you sign that
402 and call again with payment, show the human the amount, the network
and the recipient, and wait for an explicit yes — your client
auto-approving read-only tools is not that yes.
Two transports, one code:
Hosted (Streamable HTTP) — no install, since 2026-08-23. Stateless: one
POST per JSON-RPC message, no session id, application/json responses;
GET /mcp answers 405. Metered tools relay the 402 of the route behind them
and you pay with your own signature through the payment argument — the
server never signs.
{
"mcpServers": {
"describe-net": {
"type": "streamable-http",
"url": "https://api.describe.net/mcp"
}
}
}
Local (stdio) — source only for now: the repository is not yet published, so this config works once you have the code locally (the server card carries the honest distribution status). Same tools, same paywall.
{
"mcpServers": {
"describe-net": {
"command": "python",
"args": ["/absolute/path/to/the/repo/mcp/server.py"],
"env": { "DESCRIBENET_API_URL": "https://api.describe.net" }
}
}
}
WebMCP: the main pages of https://describe.net (home, the profile, the
API page and the 404) register 7 browser tools via
navigator.modelContext — same endpoints, same reading rules; the metered
ones hand you the 402 challenge with the recipient pre-checked. They cannot
sign.
Files and links
| File | URL | Purpose |
|---|---|---|
| SKILL.md (this file) | https://describe.net/skill.md |
Main documentation |
| WORKFLOWS.md | https://describe.net/workflows.md |
Concrete workflows with real curls |
| vet-a-counterparty | https://describe.net/.well-known/agent-skills/vet-a-counterparty/SKILL.md |
The focused vetting skill |
| auth.md | https://describe.net/auth.md |
The x402 flow in full: challenge, signature, replay, failure modes |
| paybox.md | https://describe.net/paybox.md |
The suggested wallet: install PayBox or check it is in use, pay and sign with it here, and its known limits |
| badge.md | https://describe.net/badge.md |
The free embeddable badge, and what it deliberately cannot do |
| a2a.md | https://describe.net/a2a.md |
The A2A door: message/send over JSON-RPC, and the agent card |
| llms.txt | https://describe.net/llms.txt |
The map of every machine-readable resource |
| Docs hub | https://docs.describe.net |
Every guide plus the rendered OpenAPI and a citable snapshot of the schema |
| OpenAPI | https://api.describe.net/openapi.json |
Every route, as schema |
| Swagger UI | https://api.describe.net/docs |
Interactive documentation |
Install as a Claude Code skill:
mkdir -p ~/.claude/skills/describe-net
curl -s https://describe.net/skill.md > ~/.claude/skills/describe-net/SKILL.md
curl -s https://describe.net/workflows.md > ~/.claude/skills/describe-net/WORKFLOWS.md
curl -s https://describe.net/paybox.md > ~/.claude/skills/describe-net/PAYBOX.md
Changelog
| Version | Date | Summary |
|---|---|---|
| 1.7.0 | 2026-10-04 | PayBox is the wallet this skill suggests first. "How to pay" now tells the agent to check whether PayBox is already in use (or install it) before reaching for any other wallet, and how its pay_x402 turns the 402 into the X-PAYMENT value. New file paybox.md: install or verify, the call step by step, and the known limits — over MCP the signature waits for a window in the human's chat (pending_signature), the CLI with a pbxk1. key signs on its own, and this API reads only X-PAYMENT. No price, no free/paid line and no payment behavior moved: any wallet that signs EIP-3009 pays the same. The version moves so installed copies learn it. |
| 1.6.0 | 2026-10-02 | GET /reputation/by-resource?url=…, free: ask by the URL of an x402 endpoint instead of by a wallet, and get, per collector, whether it holds an ERC-8004 identity, the agent id to link and its review counts — read from the facilitator's public bazaar, with no address in the answer. Built for routers and directories that hold the URL and must never hold the payment address. pricing_version moves to cost-tiered@11 (the free/paid line gained a door; no price moved). |
| 1.5.0 | 2026-10-02 | A paid MCP tool now asks for the human's yes, and says so where a client can read it. The metered tools are read-only (all but describe_lookup_wallet, whose snapshot=true writes), and a client that auto-approves read-only tools would have paid without asking. Each one now declares its cost apart from readOnlyHint, in the tool definition's _meta under net.describe/payment (requires_confirmation: true), opens its description with the price, and the server's instructions name them; the relayed 402 carries the same requires_confirmation and asks for that yes as its step 0. No price and no free/paid line moved. The version moves so installed copies refresh: an old copy would not tell its agent to ask first. |
| 1.4.0 | 2026-08-30 | Three live routes this file had never named, and the count of two things it had frozen. New here: GET /reputation/rater/{wallet} ($0.01 — the wallet as a rater, emitting no score), GET /stats/issuers (free — who wrote the index) and GET /badge/{wallet}.svg (free — the embeddable SVG), plus POST /a2a and the caveats[] subset on the free gate. The MCP tool count goes 13 → 14 (5 → 6 priced), measured with tools/list against production, not read off a page. pricing_version had moved from cost-tiered@3 to @5 in two unrecorded bumps (@4 badge + rater-profile, @5 /stats/issuers) — from now on this file names the header X-Pricing-Version instead of copying its value, for the same reason it already refuses to copy prices. This row is the mechanism, not a note: the auto-update block above only refreshes when the version: field changes, so every installed copy kept believing there were thirteen tools and five paid routes until this line moved. |
| 1.3.0 | 2026-08-23 | One box: GET /search/{query}, free, and the describe_resolve tool over it. Paste an EVM address, a Solana base58 id or an agent id and it answers what it was read as plus one row per chain with the owner wallet. It never answers in the singular: measured over 26,736 ids present on two or more chains, not one has the same owner on all of them. pricing_version bumped to cost-tiered@3 — the free/paid line moved. |
| 1.2.0 | 2026-08-23 | Hosted MCP endpoint: the same tool set as MCP Streamable HTTP at https://api.describe.net/mcp (stateless, JSON responses, POST only), mounted inside the API behind the same paywall. The stdio launcher stays as the local option. (This row carried a tool count until 1.3.0 added one; the claim it makes is «same tools over both transports», and that is what it says now — a count frozen in a changelog goes stale on the next release and nothing turns red.) |
| 1.1.0 | 2026-08-21 | /leaderboard split by path: the free first page takes no parameters (a query param answers 422 with a pointer, never 402) and paging/filtering moved to GET /leaderboard/page, $0.01 every call. pricing_version bumped to cost-tiered@2. |
| 1.0.1 | 2026-08-21 | hyperevm out (contracts deployed but zero adoption after a full scan; off the official list), robinhood in (official list, contracts measured). |
| 1.0.0 | 2026-08-21 | First public release. |
Verbatim source: skill.md · from site/skill.md at git:386e875182bb · back to the documentation portal