{"openapi":"3.1.0","info":{"title":"Sato Hub public API","version":"1.1.0","summary":"Read access to the onchain agent directory, its change feed, and the Agent Passport registry.","description":"Public, unauthenticated read endpoints for the Sato Hub directory.\n\nLicense: Catalog data CC-BY-4.0 — attribution: data by satohub.ai. Scores/liveness are informational signals, not safety or quality guarantees.\n\nScores and liveness are informational signals computed from public evidence. They are not safety ratings, audits, or claims about returns. `verification_status` distinguishes self-reported from independently checked; self-reported is never presented as verified.\n\nThe same data is available to agents over MCP (Streamable HTTP, JSON-RPC) at https://satohub.ai/api/mcp — documented at https://satohub.ai/mcp. That endpoint is not described here because it is not REST.","contact":{"name":"Sato Hub","url":"https://satohub.ai"},"license":{"name":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"}},"servers":[{"url":"https://satohub.ai"}],"tags":[{"name":"directory","description":"The catalog of components agents are built from."},{"name":"sync","description":"Incremental mirroring."},{"name":"skills","description":"Crypto-relevant agent skills with static disclosures — what a skill declares and does. Descriptions, never safety verdicts."},{"name":"agent-economy","description":"Weekly on-chain measurements per venue, chain and lifecycle stage. Nothing in these responses may be summed — read each venue's unit first."},{"name":"registry","description":"Registered onchain agents and their passports."},{"name":"badges","description":"Embeddable SVG badges. No key, hotlinkable."},{"name":"claims","description":"Maintainers proving control of a listing they own."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A Privy access token for a signed-in account. Used only by the claim endpoints; every read endpoint here is unauthenticated."}}},"paths":{"/api/export/index.json":{"get":{"tags":["directory"],"operationId":"getDirectoryJson","summary":"The full directory as JSON","description":"Every live listing, with aggregates describing the whole directory (not the slice). Deprecated listings are excluded.","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to one category. Case-insensitive; an unknown value returns an empty slice, not an error."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings supporting this chain."},{"name":"standard","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings implementing this standard."},{"name":"use_case","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to one use case."},{"name":"integration","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings that integrate with a client or framework, e.g. 'claude code', 'cursor'."},{"name":"deploys_as","in":"query","required":false,"schema":{"type":"string"},"description":"Slice by deployment shape, e.g. 'docker', 'npm', 'mcp server'."},{"name":"min_observed_success","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":100},"description":"Only listings whose share of our daily checks that succeeded is at least this percent, over at least 14 observed days. Pass 0 to get every listing that HAS a 14-day record."}],"responses":{"200":{"description":"The catalog.","content":{"application/json":{"schema":{"type":"object","properties":{"schema_version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"source":{"type":"string","format":"uri"},"license":{"type":"string"},"count":{"type":"integer","description":"Size of the returned slice."},"aggregates":{"type":"object","description":"Describes the whole directory, not the slice.","properties":{"resources":{"type":"integer"},"chains":{"type":"integer"},"scored":{"type":"integer"},"independently_checked":{"type":"integer"}}},"resources":{"type":"array","items":{"type":"object","description":"One catalog listing. Basic catalog fields only — score history, provenance, trust components and enriched commercial fields are not part of the public export.","properties":{"slug":{"type":"string","description":"Stable identifier. The join key for every other endpoint."},"name":{"type":"string"},"category":{"type":"string"},"subcategory":{"type":"string","nullable":true},"entity_class":{"type":"string","nullable":true,"enum":["resource","agent","reference",null],"description":"resource = something you build WITH; agent = a live onchain agent; reference = editorial."},"resource_type":{"type":"string","nullable":true},"interfaces":{"type":"array","items":{"type":"string"},"description":"mcp | sdk | rest-api | plugin | cli | ui | contract"},"standards":{"type":"array","items":{"type":"string"},"description":"x402 | erc-8004 | erc-8183 | mcp | a2a"},"use_cases":{"type":"array","items":{"type":"string"}},"description_short":{"type":"string"},"website_url":{"type":"string","nullable":true},"github_url":{"type":"string","nullable":true},"docs_url":{"type":"string","nullable":true},"chains_supported":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"open_source_status":{"type":"string","nullable":true},"trust_score":{"type":"integer","nullable":true,"minimum":0,"maximum":100,"description":"Sato Score: how open, active and verifiable the project is, computed from public evidence. NOT a safety, quality, audit or returns grade."},"trust_tier":{"type":"string","nullable":true,"description":"High (>=70) | Medium (>=40) | Low (<40). Null while provisional — an unearned tier is never published."},"provisional":{"type":"boolean","description":"True = not yet assessed; treat trust_tier as absent."},"liveness":{"type":"string","nullable":true,"enum":["Active","Recent","Quiet","Dormant",null],"description":"Recency of observed activity. Active <=30d, Recent <=90d, Quiet <=1y, else Dormant."},"last_activity_at":{"type":"string","format":"date-time","nullable":true},"github_stars":{"type":"integer","nullable":true},"verified_install":{"type":"boolean","description":"The documented install was actually reproduced. Says nothing about runtime safety."},"verification_status":{"type":"string","nullable":true,"description":"Self-Reported and Unverified are NOT verified states. Only Verified and Audited are earned."},"creator_name":{"type":"string","nullable":true,"description":"Who built it, when known."},"deployment_options":{"type":"array","items":{"type":"string"},"description":"How it ships: npm | pip | docker | mcp server | hosted | self-hosted | cli | sdk | claude code plugin …"},"supported_integrations":{"type":"array","items":{"type":"string"},"description":"Clients and frameworks it plugs into: cursor | claude code | claude desktop | windsurf | langchain | openclaw | x402 …"},"observed_success_pct":{"type":"number","nullable":true,"description":"Share of Sato Hub's own daily checks that succeeded over observed_days. NOT uptime: a failed check may be ours, theirs, or the network, and failures before 2026-09-01 are unattributable."},"observed_days":{"type":"integer","nullable":true,"description":"Days of daily observation behind observed_success_pct."},"install_verified_at":{"type":"string","nullable":true,"description":"Date the documented install was reproduced in an ephemeral container by Sato Hub. Null = not reproduced. Says nothing about runtime safety."},"date_added":{"type":"string","format":"date"},"detail_url":{"type":"string","format":"uri"}},"required":["slug","name","category","description_short","status","detail_url"]}}}}}}}}}},"/api/export/index.csv":{"get":{"tags":["directory"],"operationId":"getDirectoryCsv","summary":"The full directory as CSV","description":"Same rows as the JSON index. Multi-value fields are pipe-joined. Stable column order: slug, name, category, subcategory, entity_class, resource_type, description_short, status, open_source_status, trust_score, trust_tier, provisional, liveness, verification_status, verified_install, github_stars, last_activity_at, date_added, chains_supported, interfaces, standards, use_cases, tags, creator_name, deployment_options, supported_integrations, observed_success_pct, observed_days, install_verified_at, website_url, github_url, docs_url, detail_url.","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to one category. Case-insensitive; an unknown value returns an empty slice, not an error."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings supporting this chain."},{"name":"standard","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings implementing this standard."},{"name":"use_case","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to one use case."},{"name":"integration","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings that integrate with a client or framework, e.g. 'claude code', 'cursor'."},{"name":"deploys_as","in":"query","required":false,"schema":{"type":"string"},"description":"Slice by deployment shape, e.g. 'docker', 'npm', 'mcp server'."},{"name":"min_observed_success","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":100},"description":"Only listings whose share of our daily checks that succeeded is at least this percent, over at least 14 observed days. Pass 0 to get every listing that HAS a 14-day record."}],"responses":{"200":{"description":"CSV.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/api/export/index.ndjson":{"get":{"tags":["directory"],"operationId":"getDirectoryNdjson","summary":"The full directory as newline-delimited JSON","description":"One catalog record per line. Streamable; suited to jq and warehouse loads.","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to one category. Case-insensitive; an unknown value returns an empty slice, not an error."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings supporting this chain."},{"name":"standard","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings implementing this standard."},{"name":"use_case","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to one use case."},{"name":"integration","in":"query","required":false,"schema":{"type":"string"},"description":"Slice to listings that integrate with a client or framework, e.g. 'claude code', 'cursor'."},{"name":"deploys_as","in":"query","required":false,"schema":{"type":"string"},"description":"Slice by deployment shape, e.g. 'docker', 'npm', 'mcp server'."},{"name":"min_observed_success","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":100},"description":"Only listings whose share of our daily checks that succeeded is at least this percent, over at least 14 observed days. Pass 0 to get every listing that HAS a 14-day record."}],"responses":{"200":{"description":"NDJSON — one ExportEntry per line.","content":{"application/x-ndjson":{"schema":{"type":"string"}}}}}}},"/api/export/skills.json":{"get":{"tags":["skills"],"operationId":"getSkillsJson","summary":"Crypto agent skills with disclosures","description":"Agent skills from ClawHub and skills.sh that touch crypto, each with a static disclosure: hosts contacted, key generation, credential requests, remote-to-shell pipes, tool grants, third-party registration, scheduled persistence. Every flag has evidence lines on the skill's page. A disclosure is not a safety verdict. Current state only.","parameters":[{"name":"registry","in":"query","required":false,"schema":{"type":"string","enum":["clawhub","skillssh","github"]}},{"name":"flag","in":"query","required":false,"schema":{"type":"string"},"description":"Only skills carrying this disclosure flag."},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"slug","in":"query","required":false,"schema":{"type":"string"},"description":"Only skills that target this directory listing."}],"responses":{"200":{"description":"Skills.","content":{"application/json":{"schema":{"type":"object","properties":{"schema_version":{"type":"string"},"license":{"type":"string"},"flag_meanings":{"type":"object"},"count":{"type":"integer"},"skills":{"type":"array","items":{"type":"object"}}}}}}}}}},"/api/export/skills.csv":{"get":{"tags":["skills"],"operationId":"getSkillsCsv","summary":"Skills as CSV","parameters":[],"responses":{"200":{"description":"CSV.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/api/export/skills.ndjson":{"get":{"tags":["skills"],"operationId":"getSkillsNdjson","summary":"Skills as NDJSON","parameters":[],"responses":{"200":{"description":"NDJSON.","content":{"application/x-ndjson":{"schema":{"type":"string"}}}}}}},"/api/export/adoption.json":{"get":{"tags":["agent-economy"],"operationId":"getAgentEconomyJson","summary":"The measured agent economy for the current week","description":"Weekly measurements of what is actually happening on-chain across the agent venues Sato Hub tracks — identity registries, service registries, a launchpad, a payment rail and account infrastructure — from public chain reads.\n\nTHE RESPONSE CARRIES ITS OWN RULES, in a `rules` array, because the commonest way to misuse this data is to add it up. Each venue declares what ONE UNIT of it is; a registration, a staked service, a token launch and a paid task are not the same object and share no denominator.\n\nA null `value` means UNKNOWN and never zero. A rate with `publishable_rate: false` has too small a sample to quote. `covered_days` is what was actually observed, which is not always `window_days` — public nodes prune history, and on BNB Chain only hours of it are readable at all.\n\nCURRENT WEEK ONLY. The weekly series is not part of the free export.\n\nSolana identity registries are covered as UPPER BOUNDS (program-account counts; unit says so); Solana payment settlement is not covered by any row, and by transaction count x402 mostly settles there. Tempo memo-tagged transfers are MPP-shaped, not proof of MPP payments.","parameters":[{"name":"venue","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one venue."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one chain."},{"name":"stage","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one lifecycle stage."},{"name":"slug","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to measurements attributed to one directory listing."}],"responses":{"200":{"description":"The week's measurements, plus the venue catalogue needed to interpret them.","content":{"application/json":{"schema":{"type":"object","properties":{"schema_version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"source":{"type":"string","format":"uri"},"license":{"type":"string"},"week":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string"},"description":"How these numbers may and may not be used. Part of the payload, not the documentation."},"venues":{"type":"array","items":{"type":"object"},"description":"The catalogue: what one unit is per venue, entry cost, measurability, declared overlaps, and how many confirmed contracts back it."},"count":{"type":"integer"},"measurements":{"type":"array","items":{"type":"object","description":"One measurement at the grain (venue, chain, stage, week). NEVER sum these: an ERC-8004 registration, an Olas staked service, a Virtuals launch and a Mech task are four different objects, and `unit` says which one this row counts.","properties":{"venue":{"type":"string","description":"erc8004 | olas | virtuals | x402 | erc4337_accounts | key_management | singularitynet | morpheus"},"chain":{"type":"string","nullable":true,"description":"Null for venue-level rows (a venue with no chain, e.g. key_management)."},"stage":{"type":"string","description":"The lifecycle stage this row counts, e.g. registered, funded, active_beyond_registration, transacting, launched, graduated, settled_to_catalogued_seller."},"week":{"type":"string","description":"ISO week, e.g. 2026-W36."},"week_start":{"type":"string","format":"date"},"platform_host":{"type":"string","nullable":true,"description":"Set on breakdown rows attributing registrations to the platform that produced them."},"belongs_to_slug":{"type":"string","nullable":true,"description":"The directory listing this row is attributed to, when one could be resolved."},"value":{"type":"number","nullable":true,"description":"NULL means UNKNOWN. It never means zero — a measurement failure is not an observation of nothing."},"unit":{"type":"string","description":"What one of these IS. Read it before comparing two venues."},"method":{"type":"string","description":"How the figure was produced, in words. Travels with the number by design."},"evidence_tier":{"type":"integer","enum":[1,2,3],"description":"1 = proof (observing it IS the finding); 2 = indicator (countable but contaminated by human usage); 3 = inference (never assertable)."},"sample_size":{"type":"integer","nullable":true,"description":"Null for exact counts over a whole population."},"denominator":{"type":"integer","nullable":true},"window_days":{"type":"integer","nullable":true,"description":"The window requested."},"covered_days":{"type":"number","nullable":true,"description":"The window ACTUALLY covered. Public nodes prune; these differ, and only this one is comparable across chains."},"publishable_rate":{"type":"boolean","description":"False when the sample is too small to quote as a finding. The row is still returned — it is a real observation, just not a result."},"caveat":{"type":"string","nullable":true,"description":"What limited this specific measurement."},"contract":{"type":"string","nullable":true},"stale_contract":{"type":"boolean","nullable":true,"description":"True when the address confirmation is older than the re-check interval."},"as_of":{"type":"string","format":"date-time"},"venue_url":{"type":"string","format":"uri"}},"required":["venue","stage","week","value","unit","method","evidence_tier","as_of"]}}}}}}}}}},"/api/export/adoption.csv":{"get":{"tags":["agent-economy"],"operationId":"getAgentEconomyCsv","summary":"The measured agent economy as CSV","description":"Same rows as adoption.json. The method and caveat columns are carried deliberately — a spreadsheet is exactly where a number gets separated from its qualification.","parameters":[{"name":"venue","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one venue."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one chain."},{"name":"stage","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one lifecycle stage."},{"name":"slug","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to measurements attributed to one directory listing."}],"responses":{"200":{"description":"CSV.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/api/export/adoption.ndjson":{"get":{"tags":["agent-economy"],"operationId":"getAgentEconomyNdjson","summary":"The measured agent economy as newline-delimited JSON","description":"One measurement per line. Streamable.","parameters":[{"name":"venue","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one venue."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one chain."},{"name":"stage","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to one lifecycle stage."},{"name":"slug","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to measurements attributed to one directory listing."}],"responses":{"200":{"description":"NDJSON — one measurement per line.","content":{"application/x-ndjson":{"schema":{"type":"string"}}}}}}},"/api/changes":{"get":{"tags":["sync"],"operationId":"getDirectoryChanges","summary":"What changed since a date","description":"The delta companion to the full export: what was added, what changed, and what was removed since a date, so a consumer does not re-pull the whole index to find the few things that moved.\n\nREAD `coverage` BEFORE RELYING ON THIS. The endpoint reports its own completeness rather than implying it is total: `added` is exact (from date_added); `changed` reflects only what produces a changelog event, so a quiet copy edit will not appear; `removed` is approximate, because there is no deprecated_at column.\n\nTreat it as change NOTIFICATION, not a complete replication log — poll it often, and re-pull the full export periodically to correct drift.\n\nOmitting `since` defaults to a 14-day window.","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"ISO date, YYYY-MM-DD. Defaults to 14 days ago."}],"responses":{"200":{"description":"The delta, with an explicit statement of its own coverage.","content":{"application/json":{"schema":{"type":"object","properties":{"since":{"type":"string","format":"date"},"window_days":{"type":"integer"},"counts":{"type":"object","properties":{"added":{"type":"integer"},"changed":{"type":"integer"},"removed":{"type":"integer"}}},"added":{"type":"array","items":{"type":"object"}},"changed":{"type":"array","items":{"type":"object"},"description":"Grouped per resource, so a consumer syncs per record rather than per event."},"removed":{"type":"array","items":{"type":"object"}},"coverage":{"type":"object","description":"Which parts of this response are complete and which are partial. Read it.","properties":{"complete":{"type":"array","items":{"type":"string"}},"partial":{"type":"array","items":{"type":"string"}},"advice":{"type":"string"}}},"full_export":{"type":"string","format":"uri"}}}}}},"400":{"description":"`since` is not an ISO date."}}}},"/api/registry/search":{"get":{"tags":["registry"],"operationId":"searchAgents","summary":"Search listed Agent Passports","description":"Registered onchain agents. Registration proves a claim was made, and a verified wallet proves control of a key — neither is an endorsement of the agent.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Free text over name, description, creator, stack, and type."},{"name":"chain","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Agent utility type, substring-matched."}],"responses":{"200":{"description":"Matching agents.","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"agents":{"type":"array","items":{"type":"object"}}}}}}}}}},"/api/badge/{slug}":{"get":{"tags":["badges"],"operationId":"getResourceBadge","summary":"Sato Score badge (SVG)","description":"An embeddable badge for a listed resource. Hotlink it — no key, no signup. Answers 404 with a placeholder SVG (not JSON) for an unknown, deprecated or non-scoreable listing, so an <img> never renders broken. Non-scoreable means editorial listings — research papers, newsletters, communities — which carry no score by design.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The badge.","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"404":{"description":"Placeholder SVG for an unknown or non-scoreable slug.","content":{"image/svg+xml":{"schema":{"type":"string"}}}}}}},"/api/agents/{slug}/badge":{"get":{"tags":["badges"],"operationId":"getAgentBadge","summary":"Registered-on-Sato-Hub badge (SVG)","description":"An embeddable badge for a listed Agent Passport. It says registered, never verified — registration records a claim, it does not endorse the agent.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The badge.","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"404":{"description":"Placeholder SVG for an unknown or unlisted agent.","content":{"image/svg+xml":{"schema":{"type":"string"}}}}}}},"/api/agents/challenge":{"get":{"tags":["registry"],"operationId":"getWalletChallenge","summary":"Get a wallet-signature challenge","description":"Step one of self-issuing an Agent Passport. Returns a canonical message binding the agent name, wallet and a timestamp; sign it with the agent's key (EIP-191 personal_sign, EOA only) and register with the signature. Valid for 15 minutes. A verified signature proves control of the KEY — never that the agent is safe or that it does what it claims.","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string"},"description":"The agent name you will register."},{"name":"wallet","in":"query","required":true,"schema":{"type":"string"},"description":"The agent's wallet address."}],"responses":{"200":{"description":"The challenge to sign.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"signed_at":{"type":"string","format":"date-time"},"expires_in_seconds":{"type":"integer"},"next":{"type":"string"}}}}}},"400":{"description":"Missing or invalid name/wallet."}}}},"/api/agents/verify":{"post":{"tags":["registry"],"operationId":"verifyAgentOnchain","summary":"Run the on-chain checks for an agent","description":"Agent-callable. Runs each check by its own method and reports them separately: ERC-8004 registration across EVM chains, an MCP handshake, an A2A agent card, x402 presence in the Coinbase Bazaar, and multi-chain wallet activity. Read-only against public sources, and it changes nothing about the agent's trust status — every check reports what is provable, not whether the agent is good.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"wallet":{"type":"string"},"endpoint_url":{"type":"string","format":"uri"},"website_url":{"type":"string","format":"uri"},"payment_endpoint_url":{"type":"string","format":"uri"},"chains":{"type":"array","items":{"type":"string"}},"standards":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"The per-check report.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid JSON body."}}}},"/api/claim/start":{"get":{"tags":["claims"],"operationId":"startClaim","summary":"Which domains could prove this listing is yours","description":"Returns the domains derivable from THIS listing plus the token to publish for each. You cannot nominate a domain: candidates come from the listing's own website and docs hosts, which is what stops one project claiming another. Shared platforms (github.com, *.github.io, vercel.app and the like) are excluded, because proving them proves control of the platform rather than the project — such a listing returns an empty `targets` array, which is an answer, not an error.","security":[{"bearerAuth":[]}],"parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Claim targets and instructions.","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"already_claimed":{"type":"boolean"},"targets":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"source":{"type":"string"},"token":{"type":"string"},"dnsName":{"type":"string"},"fileUrl":{"type":"string","format":"uri"}}}},"instructions":{"type":"object"}}}}}},"401":{"description":"Sign in first."},"404":{"description":"No such listing."}}}},"/api/claim/verify":{"post":{"tags":["claims"],"operationId":"verifyClaim","summary":"Check the published proof","description":"Checks a TXT record at _satohub-challenge.<domain>, or the token served at https://<domain>/.well-known/satohub-claim.txt. A failed check answers 200 with verified:false and a human-readable reason — DNS propagation is a wait, not an error. On success the claim is recorded.\n\nA CLAIM GRANTS NO TRUST. It proves control of a domain. verification_status, the Sato Score and every scored field stay untouched and are not editable by a claimant.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["slug","domain","method"],"properties":{"slug":{"type":"string"},"domain":{"type":"string","description":"Must be one of the targets from /api/claim/start."},"method":{"type":"string","enum":["dns","file"]}}}}}},"responses":{"200":{"description":"Result, whether or not the proof was found.","content":{"application/json":{"schema":{"type":"object","properties":{"verified":{"type":"boolean"},"detail":{"type":"string"},"grants":{"type":"string"}}}}}},"400":{"description":"Missing fields, or a domain this listing does not point at."},"401":{"description":"Sign in first."}}}},"/api/claim/edits":{"get":{"tags":["claims"],"operationId":"getClaimEditable","summary":"Current values and what you may change","security":[{"bearerAuth":[]}],"parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Editable fields, current values, and anything already queued.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Sign in first."},"403":{"description":"You have not proven control of this listing."}}},"post":{"tags":["claims"],"operationId":"submitClaimEdits","summary":"Queue corrections to a listing you control","description":"Accepts descriptive fields only: description_short, description_long, website_url, docs_url, github_url, x_url, demo_url, tags, chains_supported. Anything else is rejected by name.\n\nEdits QUEUE rather than apply immediately: they go through the same validation every listing write uses — schema check and banned-phrase scan — and publish on the next daily refresh. An unchanged field queues nothing.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["slug","fields"],"properties":{"slug":{"type":"string"},"fields":{"type":"object","description":"field -> new value. Lists accept an array or a comma-separated string."}}}}}},"responses":{"200":{"description":"Queued.","content":{"application/json":{"schema":{"type":"object","properties":{"queued":{"type":"array","items":{"type":"string"}},"rejected":{"type":"array","items":{"type":"object"}},"note":{"type":"string"}}}}}},"400":{"description":"No editable fields in the submission."},"401":{"description":"Sign in first."},"403":{"description":"You have not proven control of this listing."}}}},"/api/agents/{slug}/manifest":{"get":{"tags":["registry"],"operationId":"getAgentManifest","summary":"An agent's passport manifest","description":"The machine-readable `sato.agent.manifest/v1` document for one listed agent.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The manifest.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No listed agent with that slug."}}}}}}