{"openapi":"3.1.0","info":{"title":"describe.net","summary":"Global cross-chain reputation for trustless agents","description":"## A score without its raters is a rumor.\n\n**describe.net decomposes any ERC-8004 reputation into the counterparties that wrote it: how many they are, how many times each one spoke, on what, and when.**\n\nBuilt for agents that have to vet a counterparty before they sign — one HTTP call instead of hours of archive RPC across chains. No account, no API key, no token: the free tier answers without headers, and the metered tier is paid per call with x402 over USDC. **Payment is the authentication.**\n\n**How big is the index? Ask it: `GET /health`** — agents, individual ratings and how far the scan reached on each chain, live, free and uncached. The numbers are not repeated on this page on purpose: indexing runs continuously, and a total typed into a document is a total that goes stale while still sounding exact.\n\nScoring policy `equal-weight-per-chain@1` · ranking `bayes-shrinkage-distinct-raters@1` · published rater weighting `one-voice-per-counterparty+bounded-trust@1`. Every scored response carries its `policy_version`: two callers can never be served different numbers.\n\n### Features\n\n| Feature | What it means |\n|---|---|\n| Cross-chain ERC-8004 index | One row per individual rating, scanned from `Registered` and `NewFeedback` logs and joined to the agent's **current** owner — never the minter, which is usually the facilitator that minted the id before transferring it. |\n| Equal weight per chain | A wallet's score is the mean of its per-chain scores, so a chain carrying hundreds of thousands of ratings cannot drown one carrying four. The per-chain detail ships in `per_chain`, never collapsed. |\n| Bayesian shrinkage in the ranking | The leaderboard is ordered by `shrunk_score` — the observed mean pulled toward the index prior by how many **distinct raters** back it. Both numbers and that N travel in every row, so the order can be recomputed by hand instead of believed. |\n| Self-ratings excluded, not hidden | A subject rating itself is out of every score and published separately as `self_rated`, with `gap = self - others`. Positive means it overrates itself. |\n| Facets by tag | The rater's `tag1` kept apart — `trust`, `liveness`, `contractRisk`, `activity` are separate judgements, not a mean. The overall score and one facet can disagree by more than 30 points on the same wallet; that gap is the product. |\n| Concentration signal | `distinct_raters`, `top_client_share` and `top_client` on every profile. Advisory — it never moves a score. Read `distinct_raters` against `total_reviews`: the largest campaign in this index sits **under 0.15 on share**, so any threshold on share alone waves it through. What gives it away is thousands of ratings per distinct rater. Verify the campaign for free — `miner-vouch` in `GET /stats/facets` carries 300,001 ratings with `distinct_agents: 1`, against the index total in `GET /health`. |\n| Provenance per rating | Agent detail returns every rating with its `tx_hash`, block number and log index — revoked ones included, with the transaction that killed them. A revocation nobody can audit is not a revocation. |\n| Time series on on-chain time | History buckets by the **block** timestamp, never by when we indexed the row, and reports `coverage.undated_reviews` so a series shorter than the score reads as coverage rather than as a bug. |\n| Second weighting published alongside | `weighted_score` and `rater_weight_policy` travel next to `final_score`. Changing how hundreds of thousands of ratings are weighted is not something a reputation index gets to do silently. |\n| Citable snapshot | `?snapshot=true` persists a durable row with `inputs_digest` + `policy_version`: a receipt you can hand a counterparty and we can recompute identically. |\n| MCP server | The same index as six tools inside your MCP client. The first is free and explains the other five. |\n\n### Pricing\n\nOne rule decides the line, and it is a rule about cost: **free is what a cache serves everybody; charged is what only you asked for.** The aggregate view of the index is free forever. The question about *your* counterparty is what costs money, which is exactly when the answer is worth something.\n\n**Free — HTTP 200, no headers, no account.** Start here: reading the free tier costs nothing and tells you whether the metered tier is worth it.\n\n| Route | What it gives you |\n|---|---|\n| `GET /health` | Liveness, plus how far the scan reached on each chain and the three policy versions in force. |\n| `GET /pricing` | Every price, machine-readable, each with the reason it costs that. The only route that never touches Postgres. |\n| `GET /docs` · `/redoc` · `/openapi.json` | This page and the schema behind it. |\n| `/manifesto/?` | — |\n| `/wallets/[^/]+/chains/?` | — |\n| `/chains(/[A-Za-z0-9_-]+)?/?` | — |\n| `/feed/?` | — |\n| `GET /leaderboard` | First page, default size, no filter — the shop window. Ranked by evidence, not by bare average. |\n| `GET /stats/facets` | Every facet in the index with its volume, mean and how many distinct agents carry it. |\n| `GET /stats/types` | Declared-type coverage across indexed agents, including how many declared none. **The heaviest aggregate in the index and the one route that can exceed the gateway timeout — it is answering 500 at the time of writing.** For a cheap read of the same grain use `GET /stats/facets`. |\n\n**Metered — HTTP 402 until paid.** These answer a question about one named subject.\n\n| Route | Price | What it gives you |\n|---|---|---|\n| `GET /leaderboard?offset=…` · `?type=…` · `?limit=` >100 | $0.01 | Paging past the shop window, widening it, or filtering by declared type. |\n| `GET /reputation/wallet/{wallet}` | $0.01 | The composition: per-chain scores, facets, self-rating gap, concentration, first and last rating. |\n| `GET /reputation/agent/{network}/{agent_id}` | $0.02 | One agent and EVERY rating it received, each with its transaction — revoked ones included. |\n| `GET /reputation/wallet/{wallet}/history` | $0.03 | The series by on-chain time, weekly or monthly, with the coverage it could actually plot. |\n| `GET /reputation/wallet/{wallet}?snapshot=true` | $0.05 | The only route that WRITES. Records a durable receipt row with `inputs_digest` + `policy_version` you can cite to a counterparty. |\n\nPricing table `cost-tiered@1`, served machine-readable and free at `GET /pricing`, each price with the reason it costs that. **The authoritative price for one call is the `accepts[]` array of that call's own 402** — the price can depend on the parameters, which a table per route cannot express.\n\n### How to pay\n\nFive steps, no registration, nothing to do before your first call. If you can sign an EIP-3009 authorization you are already a customer.\n\n1. **Call the route you want. Do not pre-authorize.** Asking without paying is free and is the intended first move — the 402 is a price quote, not an error.\n2. **Read the challenge.** The 402 body carries `amount`, `resource`, `recipient`, the pricing tier with its reason, and `accepts[]` — one entry per network. **`accepts[]` is the only thing you sign against.** Its `amount` is in token base units (USDC has 6 decimals, so `\"10000\"` is $0.01); the top-level `amount` is the human dollar figure and must not be signed. Take the USDC contract from `accepts[].asset`, never from a document.\n3. **Check who you are about to pay, every time.** The only address describe.net will ever ask you to pay is `0xe4dc963c56979E0260fc146b87eE24F18220e545`, published here and pinned out of band in the MCP server and in `auth.md`. If `payTo` differs, **do not pay** — either the challenge did not come from us, or the treasury changed and this page is stale. Both are resolved by asking, not by signing.\n4. **Sign an EIP-3009 `TransferWithAuthorization`** for that `amount`, to that `payTo`, for that `asset`, on that network, and base64-encode the x402 payload. You sign locally and send a signature — no private key ever leaves your side. An MCP wallet (`ows_sign_eip3009`, `pay_x402`) or `uvd-x402-sdk` will produce the string for you.\n5. **Replay the identical request with the `X-PAYMENT` header.** Same method, same path, same query string, one header more. Payment is verified and settled on-chain **before** the query runs; the 200 comes back with `X-Payment-Receipt` (the settlement transaction hash — public, keep it to reconcile) and `X-Payment-Reused`.\n\nNetworks the challenge will offer, chosen by settlement gas rather than by price — we pay the gas, and paying L1 gas to collect one cent would be selling at a loss:\n\n| Network | Chain ID |\n|---|---|\n| `base` | 8453 |\n| `arbitrum` | 42161 |\n| `optimism` | 10 |\n| `polygon` | 137 |\n| `celo` | 42220 |\n| `avalanche` | 43114 |\n\n**Three rules that save money.** One authorization per paid call: the nonce is consumed at settlement, so a credential that already paid will not pay again. A receipt is reusable, but only for the byte-identical resource — wallet A's receipt cannot unlock wallet B, and the reused read answers `X-Payment-Reused: true`. And **a 503 is not a 402**: `facilitator_unavailable` means your authorization was NOT used, so retry the same request with the *same* `X-PAYMENT` after `Retry-After` — signing a fresh one there can make you pay twice. Full flow, with worked examples: https://describe.net/auth.md\n\n### What we do NOT do\n\n| Not this | Why it matters to you |\n|---|---|\n| Not a block explorer | No balances, no transactions, no contract state. We serve the ratings; each one carries its `tx_hash` so you can go verify it in an explorer, which is the point. |\n| Not a price oracle | No token prices, no TVL, no market data. The only dollar figures here are our own prices. |\n| Not a credit score | Nothing here predicts default and nothing here is an approval. We report who rated a subject, how many of them there were, on what, and when. The decision stays yours — and a single number was never enough to make it. |\n| Not a writer to any chain | Zero contracts deployed, zero transactions signed by us. This is a read-only index; the only thing that moves on-chain is your own payment, settled by the facilitator. |\n| Not an identity service | A wallet is a wallet. There is no name lookup and no person search, and no amount of on-chain behaviour makes us call a subject a person. |\n\n### Links\n\n| Resource | URL |\n|---|---|\n| Site | https://describe.net |\n| OpenAPI 3.1 schema | https://api.describe.net/openapi.json |\n| API catalog (RFC 9727 linkset) | https://describe.net/.well-known/api-catalog |\n| How to authenticate — i.e. how to pay | https://describe.net/auth.md |\n| MCP server card | https://describe.net/.well-known/mcp/server-card.json |\n| Live prices | https://api.describe.net/pricing |\n| Live index coverage | https://api.describe.net/health |","version":"1.0.0"},"paths":{"/health":{"get":{"tags":["Free"],"summary":"Index size and scan coverage — free","description":"How big the index is and how far the scan reached on each chain, live and uncached: `agents`, `feedback_entries`, and one row per chain with `last_scanned_block` against `head_at_last_sync`.\n\n**This is where the numbers live.** No total is written into this page by hand — indexing runs continuously, and a total typed into a document goes stale while still sounding exact. It also publishes the three policy versions in force, which is what lets you tell whether two answers are comparable.\n\n`chains[].network` is also the vocabulary for the `{network}` path parameter of the agent route.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/pricing":{"get":{"tags":["Free"],"summary":"Every price and why it costs that — free","description":"The full pricing table, machine-readable, each price with the reason it costs that — plus `pricing_version` and the networks payment is accepted on. Read it to budget before signing anything, and to reconcile afterwards against what you were charged.\n\nThe only route that never touches Postgres, so it keeps answering with the index down.\n\n**The authoritative price for one call is the `accepts[]` array of that call's own 402**, not this table: the price can depend on the parameters (`?snapshot=true`, paging the leaderboard), which a table per route cannot express.","operationId":"get_pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Pricing Pricing Get"}}}}}}},"/manifesto":{"get":{"tags":["Free"],"summary":"The manifesto, as data — free","description":"**What this service believes, wired to the code that enforces it.**\n\nEach principle carries `enforced_by`: the file or the route that makes it true, so the claim can be checked instead of believed. `inherited_from` says which of DescribeMe's ten Principles from 2012 it comes from — and which ones it *corrects*, which is the more useful half.\n\n`verifications` is the part worth calling: every claim in the manifesto that can be checked from outside, each with the exact command that checks it. All but one are free, because a document that charges to be verified is not a document, it is an ad.\n\n**No figure of the index is copied into this response** — the routes named in `verifications` serve them live, and a number frozen inside a manifesto is the oldest way to lie with true statements. The one exception is `origin`, which counts a database that stopped taking writes in 2021.\n\nThe prose is not here either: it is published in full at the URLs in `editions`, in English and Spanish. This route never touches Postgres, so it keeps answering with the index down.","operationId":"get_manifesto_manifesto_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Manifesto Manifesto Get"}}}}}}},"/reputation/wallet/{wallet}":{"get":{"tags":["Metered (x402)"],"summary":"Decompose one wallet's reputation — $0.01 USDC ($0.05 USDC with ?snapshot=true)","description":"**The core product.** Everything that produced the score, not just the score: `per_chain` (never collapsed), `facets` by the rater's tag, `self_rated` with its `gap`, `concentration` (`distinct_raters`, `top_client_share`, `top_client`), `activity` by on-chain time, and both `final_score` and `weighted_score` side by side with the policy that produced each.\n\nA wallet we have no evidence about is a **200 with a null score**, not a 404: *we hold nothing on this counterparty* is a useful answer to someone deciding whether to sign.\n\n`concentration` may come back null on its own while the rest of the answer stands — a side signal that timed out must not take the answer with it. Handle the null.","operationId":"wallet_reputation_reputation_wallet__wallet__get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","description":"The subject, as a `0x` EVM address. Case-insensitive. This is the identity the index keys on: agent ids are resolved to their **current owner** before the grain is grouped here, so one wallet carries everything its agents earned across every chain.","examples":["0x715dc035ffb97dd7bb4095c6670138ba05bb4e6d"],"title":"Wallet"},"description":"The subject, as a `0x` EVM address. Case-insensitive. This is the identity the index keys on: agent ids are resolved to their **current owner** before the grain is grouped here, so one wallet carries everything its agents earned across every chain."},{"name":"snapshot","in":"query","required":false,"schema":{"type":"boolean","description":"Persist this answer to `score_snapshots` and return the row. **Costs more — this is the only route that writes.** What you buy is not the number, it is the commitment to it: a durable receipt with `inputs_digest` + `policy_version` that you can cite to a counterparty and we can recompute identically.","default":false,"title":"Snapshot"},"description":"Persist this answer to `score_snapshots` and return the row. **Costs more — this is the only route that writes.** What you buy is not the number, it is the commitment to it: a durable receipt with `inputs_digest` + `policy_version` that you can cite to a counterparty and we can recompute identically."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletScore"}}}},"402":{"description":"**Payment required — $0.01 USDC, or $0.05 USDC with `?snapshot=true`.** Not an error: this is the price quote, and asking for it is free.\n\nThe body carries `amount` (human dollars, **never sign this one**), `resource`, `recipient`, `x402Version`, `scheme`, `maxTimeoutSeconds`, `retryable`, `pricing` (version, tier and the reason it costs that), `next_action`, and **`accepts[]` — one entry per network, and the only thing you sign against**. Each entry gives `network`, `asset` (the USDC contract), `amount` in token base units, and `payTo`.\n\n`payTo` must equal `0xe4dc963c56979E0260fc146b87eE24F18220e545`. If it does not, do not sign.\n\nHeaders: `Payment-Required` (the same challenge, base64), `X-Accept-Payment`, `X-Pricing-Version`, `Cache-Control: no-store`.\n\nThen replay this identical request with the `X-PAYMENT` header. The 200 comes back with `X-Payment-Receipt` and `X-Payment-Reused`."},"503":{"description":"**`facilitator_unavailable` — and a 503 is not a 402.** Your authorization was NOT used and nothing was charged. Retry this same request with the **same** `X-PAYMENT` header after `Retry-After`; signing a fresh authorization here is how you pay twice."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reputation/wallet/{wallet}/history":{"get":{"tags":["Metered (x402)"],"summary":"How that reputation moved over time — $0.03 USDC","description":"The series bucketed by the **block** timestamp — when the rating was written on chain, never when we indexed it. Substituting our own ingestion time would date every historical rating to the day of the backfill.\n\n`coverage.undated_reviews` reports how much of the grain could not be placed in time, so a series shorter than the score reads as coverage rather than as a bug.","operationId":"wallet_history_reputation_wallet__wallet__history_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","description":"The subject, as a `0x` EVM address. Case-insensitive.","title":"Wallet"},"description":"The subject, as a `0x` EVM address. Case-insensitive."},{"name":"bucket","in":"query","required":false,"schema":{"enum":["week","month"],"type":"string","description":"Size of each point in the series","default":"week","title":"Bucket"},"description":"Size of each point in the series"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletHistory"}}}},"402":{"description":"**Payment required — $0.03 USDC.** Not an error: this is the price quote, and asking for it is free.\n\nThe body carries `amount` (human dollars, **never sign this one**), `resource`, `recipient`, `x402Version`, `scheme`, `maxTimeoutSeconds`, `retryable`, `pricing` (version, tier and the reason it costs that), `next_action`, and **`accepts[]` — one entry per network, and the only thing you sign against**. Each entry gives `network`, `asset` (the USDC contract), `amount` in token base units, and `payTo`.\n\n`payTo` must equal `0xe4dc963c56979E0260fc146b87eE24F18220e545`. If it does not, do not sign.\n\nHeaders: `Payment-Required` (the same challenge, base64), `X-Accept-Payment`, `X-Pricing-Version`, `Cache-Control: no-store`.\n\nThen replay this identical request with the `X-PAYMENT` header. The 200 comes back with `X-Payment-Receipt` and `X-Payment-Reused`."},"503":{"description":"**`facilitator_unavailable` — and a 503 is not a 402.** Your authorization was NOT used and nothing was charged. Retry this same request with the **same** `X-PAYMENT` header after `Retry-After`; signing a fresh authorization here is how you pay twice."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reputation/agent/{network}/{agent_id}":{"get":{"tags":["Metered (x402)"],"summary":"One agent and EVERY rating it received — $0.02 USDC","description":"The evidence itself, not a summary of it: every individual rating with its `tx_hash`, block number and log index, so each one can be checked in an explorer. **Revoked ratings included**, each with the transaction that killed it — a revocation nobody can audit is not a revocation.\n\nAn agent id we have never seen is a **404**, unlike the wallet route: an id is a claim about a specific registry entry, and we either indexed it or we did not.","operationId":"agent_reputation_reputation_agent__network___agent_id__get","parameters":[{"name":"network","in":"path","required":true,"schema":{"type":"string","description":"Chain the agent id lives on. **The valid values are the `chains[].network` names in `GET /health`** (free), which is also how you see how far the scan reached on each one. An id is only unique per chain: the same number is a different agent elsewhere.","examples":["base"],"title":"Network"},"description":"Chain the agent id lives on. **The valid values are the `chains[].network` names in `GET /health`** (free), which is also how you see how far the scan reached on each one. An id is only unique per chain: the same number is a different agent elsewhere."},{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","description":"ERC-8004 registry id, as minted on that chain. Ratings are joined to the agent's **current** owner, never the minter — which is usually the facilitator that minted the id before transferring it.","examples":["25975"],"title":"Agent Id"},"description":"ERC-8004 registry id, as minted on that chain. Ratings are joined to the agent's **current** owner, never the minter — which is usually the facilitator that minted the id before transferring it."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentScore"}}}},"402":{"description":"**Payment required — $0.02 USDC.** Not an error: this is the price quote, and asking for it is free.\n\nThe body carries `amount` (human dollars, **never sign this one**), `resource`, `recipient`, `x402Version`, `scheme`, `maxTimeoutSeconds`, `retryable`, `pricing` (version, tier and the reason it costs that), `next_action`, and **`accepts[]` — one entry per network, and the only thing you sign against**. Each entry gives `network`, `asset` (the USDC contract), `amount` in token base units, and `payTo`.\n\n`payTo` must equal `0xe4dc963c56979E0260fc146b87eE24F18220e545`. If it does not, do not sign.\n\nHeaders: `Payment-Required` (the same challenge, base64), `X-Accept-Payment`, `X-Pricing-Version`, `Cache-Control: no-store`.\n\nThen replay this identical request with the `X-PAYMENT` header. The 200 comes back with `X-Payment-Receipt` and `X-Payment-Reused`."},"503":{"description":"**`facilitator_unavailable` — and a 503 is not a 402.** Your authorization was NOT used and nothing was charged. Retry this same request with the **same** `X-PAYMENT` header after `Retry-After`; signing a fresh authorization here is how you pay twice."},"404":{"description":"`agent not indexed` — no entry for that id on that network. Check the chain is one of `chains[].network` in `GET /health`, and that the scan has reached the block the agent was registered in."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leaderboard":{"get":{"tags":["Free"],"summary":"Top agents ranked by evidence — free first page, $0.01 to page or filter","description":"Ordered by `shrunk_score`: the observed mean pulled toward the index prior by how many **distinct raters** back it, so twenty honest ratings outrank one perfect one. Both numbers and that N travel in every row, so the order can be recomputed by hand instead of believed.\n\n**Free** with the defaults — no `type`, `offset=0`, `limit` up to 100. That is the shop window: one query, identical for everybody, cacheable.\n\n**$0.01 USDC** for anything past it — any `offset`, any `type`, or a `limit` above 100. That is no longer looking, it is extracting: each page recomputes over the full grain plus the index prior, and `offset` × `type` opens a key space no cache amortizes.\n\n`rank` is relative to the filter and page that produced it, not a stored position.\n\n**There is deliberately no `?network=` here.** Narrowing to a chain does not filter this list, it redefines the number: a wallet's `final_score` averages its per-chain means, and on one chain it is that chain's mean alone. Two endpoints answering the same question with different arithmetic is how a caller ends up comparing numbers that were never comparable. The chain-scoped ranking lives in `GET /chains/{network}`, scored — and shrunk against that chain's own prior — accordingly.","operationId":"get_leaderboard_leaderboard_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Self-declared type to filter by; 'unknown' selects the agents that declared none","title":"Type"},"description":"Self-declared type to filter by; 'unknown' selects the agents that declared none"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page. Up to 100 is free; above that the call is metered.","default":100,"title":"Limit"},"description":"Rows per page. Up to 100 is free; above that the call is metered."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip. Any value but 0 makes the call metered.","default":0,"title":"Offset"},"description":"Rows to skip. Any value but 0 makes the call metered."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaderboardRow"},"title":"Response Get Leaderboard Leaderboard Get"}}}},"402":{"description":"**Payment required — $0.01 USDC.** Not an error: this is the price quote, and asking for it is free.\n\nThe body carries `amount` (human dollars, **never sign this one**), `resource`, `recipient`, `x402Version`, `scheme`, `maxTimeoutSeconds`, `retryable`, `pricing` (version, tier and the reason it costs that), `next_action`, and **`accepts[]` — one entry per network, and the only thing you sign against**. Each entry gives `network`, `asset` (the USDC contract), `amount` in token base units, and `payTo`.\n\n`payTo` must equal `0xe4dc963c56979E0260fc146b87eE24F18220e545`. If it does not, do not sign.\n\nHeaders: `Payment-Required` (the same challenge, base64), `X-Accept-Payment`, `X-Pricing-Version`, `Cache-Control: no-store`.\n\nThen replay this identical request with the `X-PAYMENT` header. The 200 comes back with `X-Payment-Receipt` and `X-Payment-Reused`."},"503":{"description":"**`facilitator_unavailable` — and a 503 is not a 402.** Your authorization was NOT used and nothing was charged. Retry this same request with the **same** `X-PAYMENT` header after `Retry-After`; signing a fresh authorization here is how you pay twice."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats/types":{"get":{"tags":["Free"],"summary":"Declared-type coverage — free, and the slowest route here","description":"Agent counts and average score per self-declared type. The `unknown` bucket is always present, even at zero: how much of the universe the classification actually covers is the point, and an absent row would read as full coverage.\n\n**It used to answer 500** — a full scan of the grain against a gateway timeout — and since 2026-08-11 it is materialised: ~0,5 s at the origin, ~70 ms from the edge cache. It is a snapshot, so it is worth what the last refresh is worth.\n\n**There is no `?network=` here, on purpose.** The type breakdown is 84 % `unknown`, so slicing it by chain would multiply a weak signal rather than sharpen it. For a per-chain view use `GET /chains/{network}`, which carries the cuts that do have data behind them.","operationId":"stats_types_stats_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypeBreakdown"}}}}}}},"/stats/facets":{"get":{"tags":["Free"],"summary":"Every facet in the index, by volume — free","description":"One entry per rater tag with its `count`, `avg_score` and `distinct_agents`, ordered by volume. Facets are separate judgements — `trust`, `liveness`, `contractRisk`, `activity` — not something to average together.\n\nIt is also the cheapest way to audit this index: the loudest tag in it is a single campaign, and `distinct_agents: 1` on a six-figure `count` is what says so.","operationId":"stats_facets_stats_facets_get","parameters":[{"name":"network","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to one chain. Facets are chain-local in practice: `miner-vouch` dominates base and does not exist on celo.","title":"Network"},"description":"Restrict to one chain. Facets are chain-local in practice: `miner-vouch` dominates base and does not exist on celo."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/FacetStat"},"title":"Response Stats Facets Stats Facets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chains":{"get":{"tags":["Free"],"summary":"Every indexed chain, side by side — free","description":"One row per chain. **The seven chains are not seven slices of one market, they are seven different markets**, and this is the endpoint that says so: ethereum holds 49.712 agents and 0,06 ratings per agent — identity without reputation — while avalanche shows 14.378 ratings from **eleven** raters, one of whom writes 64 % of them.\n\n`avg_value` is never meaningful without `distinct_raters` and `top_rater_share`, so all three travel together. A mean of 76,95 from eleven accounts is not better than 22,95 from twelve thousand; it is a different question.\n\n`orphan_ratings` is our own coverage, published: ratings pointing at an agent we never indexed. It is the number that exposed a chain sitting at 0,1 % coverage while every other signal looked healthy.","operationId":"chains_chains_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ChainStat"},"type":"array","title":"Response Chains Chains Get"}}}}}}},"/chains/{network}":{"get":{"tags":["Free"],"summary":"One chain in full — stats, top wallets, facets and activity","description":"Everything about a single chain in one call: its profile, its top wallets **scored with that chain's ratings only**, its facets by volume, and its daily activity.\n\nThe scores here are not the global scores filtered. Narrowing to a chain redefines the aggregate: a wallet's global `final_score` averages its per-chain means, while here it is this chain's mean and nothing else — and its `distinct_raters` changes too. The shrinkage prior is **this chain's** prior, so a chain is never judged with another chain's yardstick.","operationId":"chain_detail_chains__network__get","parameters":[{"name":"network","in":"path","required":true,"schema":{"type":"string","title":"Network"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Top wallets to return","default":25,"title":"Limit"},"description":"Top wallets to return"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Days of activity history","default":90,"title":"Days"},"description":"Days of activity history"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainDetail"}}}},"404":{"description":"That chain is not in the index"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wallets/{wallet}/chains":{"get":{"tags":["Free"],"summary":"Every ERC-8004 identity a wallet holds, and its reputation per chain — free","description":"**The number, free.** Which ERC-8004 identities a wallet holds on each chain, and the reputation it accumulated there — scored with that chain's ratings only.\n\nThis is free on purpose, and the reason is this site's own promise: *we do not sell you the number — the chain is public and you can compute it yourself. We sell you who it is made of.* What stays paid is exactly that decomposition: which counterparties rated, how many times each, in what facet, on what date and in which transaction — `GET /reputation/wallet/{wallet}`.\n\nChains where the wallet holds an identity but has **no** ratings are listed with `final_score: null`. That is a fact, not a gap: 'registered here and nobody rated it' and 'not here at all' are different answers and must not collapse into the same empty row.","operationId":"wallet_chains_wallets__wallet__chains_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","description":"The wallet address (EVM, 0x…)","title":"Wallet"},"description":"The wallet address (EVM, 0x…)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletChains"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feed":{"get":{"tags":["Free"],"summary":"The index's pulse — the newest ratings, in chain order, free","description":"**A feed of facts, not of opinions.** Every row already happened in a finalised block and is already public: who rated which identity, with what value, under which facet, and in which transaction. No third party writes free text about anyone here — `facet` is the on-chain tag the rater chose, not a comment — which is why this endpoint needs no moderation.\n\nOrdered by `block_time`, the chain's own clock, never by when we indexed it: this index backfilled years of history in one afternoon, so ordering by our clock would pile the whole past onto that day.\n\nSame validity domain as every score on this site: revoked ratings are out, and so is anything outside `0 < value <= 100`. A feed that showed what the score discards would teach you a reality no other endpoint confirms.\n\n**There is no `network` filter, and that is measured, not forgotten.** Filtering by chain makes the planner walk the global time index backwards until it collects enough rows of that chain: 0,12 ms on base but **26,7 s on avalanche**, past the function's own 25 s timeout. Offering a parameter that breaks on two of nine chains is worse than not offering it.","operationId":"feed_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"How many events to return","default":50,"title":"Limit"},"description":"How many events to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedEvent"},"title":"Response Feed Feed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Activity":{"properties":{"first_rating_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Rating At"},"last_rating_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Rating At"}},"type":"object","required":["first_rating_at","last_rating_at"],"title":"Activity","description":"First and last rating BY ON-CHAIN TIME, never by when we indexed it.\n\nBoth are null until the log scan backfills `block_time`, which is the\nhonest answer: we do not know yet. Substituting our own ingestion timestamp\nwould date every historical rating to the day of the backfill."},"AgentScore":{"properties":{"network":{"type":"string","title":"Network"},"agent_id":{"type":"string","title":"Agent Id"},"current_owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner"},"declared_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Declared Type"},"agent_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Uri"},"indexed_identity":{"type":"boolean","title":"Indexed Identity"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"review_count":{"type":"integer","title":"Review Count"},"revoked_count":{"type":"integer","title":"Revoked Count"},"facets":{"additionalProperties":{"$ref":"#/components/schemas/Facet"},"type":"object","title":"Facets"},"concentration":{"anyOf":[{"$ref":"#/components/schemas/Concentration"},{"type":"null"}]},"ratings":{"items":{"$ref":"#/components/schemas/Rating"},"type":"array","title":"Ratings"},"policy_version":{"type":"string","title":"Policy Version"}},"type":"object","required":["network","agent_id","current_owner","declared_type","agent_uri","indexed_identity","score","review_count","revoked_count","facets","concentration","ratings","policy_version"],"title":"AgentScore"},"ChainDay":{"properties":{"day":{"type":"string","format":"date","title":"Day"},"ratings":{"type":"integer","title":"Ratings"},"raters":{"type":"integer","title":"Raters"}},"type":"object","required":["day","ratings","raters"],"title":"ChainDay"},"ChainDetail":{"properties":{"stats":{"$ref":"#/components/schemas/ChainStat"},"top":{"items":{"$ref":"#/components/schemas/ChainRow"},"type":"array","title":"Top"},"facets":{"items":{"$ref":"#/components/schemas/ChainFacet"},"type":"array","title":"Facets"},"activity":{"items":{"$ref":"#/components/schemas/ChainDay"},"type":"array","title":"Activity"}},"type":"object","required":["stats","top","facets","activity"],"title":"ChainDetail"},"ChainFacet":{"properties":{"facet":{"type":"string","title":"Facet"},"count":{"type":"integer","title":"Count"},"distinct_agents":{"type":"integer","title":"Distinct Agents"},"distinct_raters":{"type":"integer","title":"Distinct Raters"},"avg_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Score"}},"type":"object","required":["facet","count","distinct_agents","distinct_raters","avg_score"],"title":"ChainFacet"},"ChainRow":{"properties":{"rank":{"type":"integer","title":"Rank"},"wallet":{"type":"string","title":"Wallet"},"final_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Score"},"shrunk_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shrunk Score"},"distinct_raters":{"type":"integer","title":"Distinct Raters"},"total_reviews":{"type":"integer","title":"Total Reviews"},"agent_count":{"type":"integer","title":"Agent Count"},"declared_types":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Declared Types"}},"type":"object","required":["rank","wallet","final_score","shrunk_score","distinct_raters","total_reviews","agent_count","declared_types"],"title":"ChainRow","description":"Una wallet dentro de UNA cadena."},"ChainScore":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"review_count":{"type":"integer","title":"Review Count"},"agent_ids":{"items":{"type":"string"},"type":"array","title":"Agent Ids"}},"type":"object","required":["score","review_count","agent_ids"],"title":"ChainScore"},"ChainStat":{"properties":{"network":{"type":"string","title":"Network"},"agents":{"type":"integer","title":"Agents"},"owners":{"type":"integer","title":"Owners"},"typed_agents":{"type":"integer","title":"Typed Agents"},"ratings":{"type":"integer","title":"Ratings"},"distinct_raters":{"type":"integer","title":"Distinct Raters"},"revoked":{"type":"integer","title":"Revoked"},"orphan_ratings":{"type":"integer","title":"Orphan Ratings"},"facets":{"type":"integer","title":"Facets"},"out_of_domain":{"type":"integer","title":"Out Of Domain"},"self_rated":{"type":"integer","title":"Self Rated"},"avg_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Value"},"top_rater_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top Rater Share"},"ratings_per_agent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ratings Per Agent"},"first_rating_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Rating At"},"last_rating_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Rating At"},"last_scanned_block":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Scanned Block"},"blocks_behind":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blocks Behind"}},"type":"object","required":["network","agents","owners","typed_agents","ratings","distinct_raters","revoked","orphan_ratings","facets","out_of_domain","self_rated","avg_value","top_rater_share","ratings_per_agent","first_rating_at","last_rating_at","last_scanned_block","blocks_behind"],"title":"ChainStat","description":"El perfil de una cadena.\n\n`avg_value` NUNCA viaja sola: `distinct_raters` y `top_rater_share` van al\nlado en el mismo objeto, y esa es una decisión de producto, no de esquema.\nMedido en este índice: avalanche promedia 76,95 y base 22,95, y el que lea\nsólo esos dos números concluye que avalanche es mejor. La media de avalanche\nsale de ONCE calificadores, con uno solo poniendo el 64 %; la de base, de\n12.624. Publicar una media sin su N es el rumor que este sitio dice combatir."},"Concentration":{"properties":{"distinct_raters":{"type":"integer","title":"Distinct Raters"},"top_client_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top Client Share"},"top_client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Client"}},"type":"object","required":["distinct_raters","top_client_share","top_client"],"title":"Concentration","description":"ADVISORY. Who the ratings came from. Never blocks, never moves a score.\n\nNullable ON PURPOSE, and consumers must handle the null: this is a\nsecondary aggregate, so when its query fails the endpoint drops the signal\nrather than the answer. A reputation service that returns nothing because a\nside-signal timed out has failed at its actual job.\n\n`top_client_share` alone is not the tell. The campaign in this index — one\nagent, 300.001 ratings, 62 raters — sits near 0,14. Read `distinct_raters`\nagainst `total_reviews`."},"Facet":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["score","count"],"title":"Facet","description":"One area of reputation, taken from the rater's `tag1`.\n\nA wallet is not a number. `trust`, `liveness`, `contractRisk` and\n`activity` are separate judgements that live side by side on chain, and a\ncaller picking a counterparty acts on the areas, not on their mean."},"FacetStat":{"properties":{"count":{"type":"integer","title":"Count"},"avg_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Score"},"distinct_agents":{"type":"integer","title":"Distinct Agents"}},"type":"object","required":["count","avg_score","distinct_agents"],"title":"FacetStat","description":"A facet across the whole index.\n\n`distinct_agents` is what separates a facet from a campaign: volume alone\nranks a single-target vouching run above every honest signal there is."},"FeedEvent":{"properties":{"network":{"type":"string","title":"Network"},"agent_id":{"type":"string","title":"Agent Id"},"rater":{"type":"string","title":"Rater"},"subject_wallet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Wallet"},"value":{"type":"number","title":"Value"},"facet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facet"},"block_time":{"type":"string","format":"date-time","title":"Block Time"},"tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Hash"}},"type":"object","required":["network","agent_id","rater","subject_wallet","value","facet","block_time","tx_hash"],"title":"FeedEvent","description":"Una calificación que ya ocurrió en un bloque finalizado."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Health":{"properties":{"status":{"type":"string","title":"Status"},"policy_version":{"type":"string","title":"Policy Version"},"ordering_policy":{"type":"string","title":"Ordering Policy"},"rater_weight_policy":{"type":"string","title":"Rater Weight Policy"},"agents":{"type":"integer","title":"Agents"},"feedback_entries":{"type":"integer","title":"Feedback Entries"},"chains":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Chains"}},"type":"object","required":["status","policy_version","ordering_policy","rater_weight_policy","agents","feedback_entries","chains"],"title":"Health"},"HistoryCoverage":{"properties":{"dated_reviews":{"type":"integer","title":"Dated Reviews"},"undated_reviews":{"type":"integer","title":"Undated Reviews"}},"type":"object","required":["dated_reviews","undated_reviews"],"title":"HistoryCoverage","description":"How much of the wallet's reputation the series could actually plot.\n\nRatings without `block_time` are excluded from every point — the log scan\nhas not dated them yet. Reported instead of hidden: while\n`undated_reviews > 0` the last point of the series is legitimately below\n`final_score`, and without this field that gap reads as a bug."},"HistoryPoint":{"properties":{"period":{"type":"string","format":"date-time","title":"Period"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"review_count":{"type":"integer","title":"Review Count"},"cumulative_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cumulative Score"}},"type":"object","required":["period","score","review_count","cumulative_score"],"title":"HistoryPoint","description":"One bucket of the time series.\n\n`score` is what that period's ratings said; `cumulative_score` is the score\ncomputed over everything up to and including it — the number the API would\nhave served on that date. They answer different questions and the graph\nneeds both: the first is spiky by nature, the second is the trend line."},"LeaderboardRow":{"properties":{"rank":{"type":"integer","title":"Rank"},"wallet":{"type":"string","title":"Wallet"},"final_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Score"},"shrunk_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shrunk Score"},"distinct_raters":{"type":"integer","title":"Distinct Raters"},"chain_count":{"type":"integer","title":"Chain Count"},"total_reviews":{"type":"integer","title":"Total Reviews"},"networks":{"items":{"type":"string"},"type":"array","title":"Networks"},"declared_types":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Declared Types"}},"type":"object","required":["rank","wallet","final_score","shrunk_score","distinct_raters","chain_count","total_reviews","networks","declared_types"],"title":"LeaderboardRow"},"Rating":{"properties":{"client":{"type":"string","title":"Client"},"feedback_index":{"type":"integer","title":"Feedback Index"},"value":{"type":"integer","title":"Value"},"value_decimals":{"type":"integer","title":"Value Decimals"},"normalized_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Normalized Value"},"tag1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag1"},"tag2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag2"},"is_revoked":{"type":"boolean","title":"Is Revoked"},"tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Hash"},"block_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Block Number"},"log_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Log Index"},"feedback_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Uri"},"feedback_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Hash"},"revoked_tx":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked Tx"}},"type":"object","required":["client","feedback_index","value","value_decimals","normalized_value","tag1","tag2","is_revoked","tx_hash","block_number","log_index","feedback_uri","feedback_hash","revoked_tx"],"title":"Rating"},"SelfRated":{"properties":{"count":{"type":"integer","title":"Count"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gap"}},"type":"object","required":["count","score","gap"],"title":"SelfRated","description":"Lo que el sujeto dice de si mismo — excluido del score, no del perfil.\n\n`gap` = self - others. Positivo significa que se sobrevalora. Es la lectura\nmas informativa del perfil y sale gratis del predicado que ya excluye la\nautocalificacion del promedio."},"Snapshot":{"properties":{"id":{"type":"integer","title":"Id"},"inputs_digest":{"type":"string","title":"Inputs Digest"},"policy_version":{"type":"string","title":"Policy Version"},"computed_at":{"type":"string","format":"date-time","title":"Computed At"}},"type":"object","required":["id","inputs_digest","policy_version","computed_at"],"title":"Snapshot"},"TypeBreakdown":{"properties":{"classification_source":{"type":"string","title":"Classification Source"},"total_agents":{"type":"integer","title":"Total Agents"},"types":{"additionalProperties":{"$ref":"#/components/schemas/TypeStats"},"type":"object","title":"Types"}},"type":"object","required":["classification_source","total_agents","types"],"title":"TypeBreakdown"},"TypeStats":{"properties":{"agent_count":{"type":"integer","title":"Agent Count"},"rated_agent_count":{"type":"integer","title":"Rated Agent Count"},"avg_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Score"},"total_reviews":{"type":"integer","title":"Total Reviews"}},"type":"object","required":["agent_count","rated_agent_count","avg_score","total_reviews"],"title":"TypeStats"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WalletChain":{"properties":{"network":{"type":"string","title":"Network"},"agent_count":{"type":"integer","title":"Agent Count"},"agent_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Agent Ids"},"final_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Score"},"total_reviews":{"type":"integer","title":"Total Reviews"},"distinct_raters":{"type":"integer","title":"Distinct Raters"}},"type":"object","required":["network","agent_count","agent_ids","final_score","total_reviews","distinct_raters"],"title":"WalletChain","description":"Una cadena en la que esta wallet existe, tenga o no reputación ahí."},"WalletChains":{"properties":{"wallet":{"type":"string","title":"Wallet"},"chains":{"items":{"$ref":"#/components/schemas/WalletChain"},"type":"array","title":"Chains"},"identity_count":{"type":"integer","title":"Identity Count"},"chains_with_identity":{"type":"integer","title":"Chains With Identity"},"chains_with_reputation":{"type":"integer","title":"Chains With Reputation"},"total_reviews":{"type":"integer","title":"Total Reviews"},"global_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Global Score"},"policy_version":{"type":"string","title":"Policy Version"}},"type":"object","required":["wallet","chains","identity_count","chains_with_identity","chains_with_reputation","total_reviews","global_score","policy_version"],"title":"WalletChains"},"WalletHistory":{"properties":{"wallet":{"type":"string","title":"Wallet"},"bucket":{"type":"string","title":"Bucket"},"points":{"items":{"$ref":"#/components/schemas/HistoryPoint"},"type":"array","title":"Points"},"coverage":{"$ref":"#/components/schemas/HistoryCoverage"}},"type":"object","required":["wallet","bucket","points","coverage"],"title":"WalletHistory"},"WalletScore":{"properties":{"wallet":{"type":"string","title":"Wallet"},"final_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Score"},"weighted_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weighted Score"},"rater_weight_policy":{"type":"string","title":"Rater Weight Policy"},"chain_count":{"type":"integer","title":"Chain Count"},"total_reviews":{"type":"integer","title":"Total Reviews"},"per_chain":{"additionalProperties":{"$ref":"#/components/schemas/ChainScore"},"type":"object","title":"Per Chain"},"facets":{"additionalProperties":{"$ref":"#/components/schemas/Facet"},"type":"object","title":"Facets"},"self_rated":{"$ref":"#/components/schemas/SelfRated"},"concentration":{"anyOf":[{"$ref":"#/components/schemas/Concentration"},{"type":"null"}]},"activity":{"$ref":"#/components/schemas/Activity"},"policy_version":{"type":"string","title":"Policy Version"},"snapshot":{"anyOf":[{"$ref":"#/components/schemas/Snapshot"},{"type":"null"}]}},"type":"object","required":["wallet","final_score","weighted_score","rater_weight_policy","chain_count","total_reviews","per_chain","facets","self_rated","concentration","activity","policy_version"],"title":"WalletScore"}}},"tags":[{"name":"Free","description":"No payment, no headers, no account. The aggregate view of the index: one query that serves everybody, so the marginal caller costs nothing. Start here — reading these tells you whether the metered tier is worth it."},{"name":"Metered (x402)","description":"Answers a question about one named subject. Returns **HTTP 402 with a signable challenge** until paid; calling it unpaid is free and is the intended first move. See **How to pay** at the top of this page — and pay only the address published there."}]}