Sato Hub data formats
Versioned JSON Schemas for every format Sato Hub publishes, free to validate against and reuse.
- Schemas21
- JSON Schema2020-12
What a schema coversShowHide
Every machine-readable shape Sato Hub emits is written as JSON Schema (draft 2020-12) at a stable URL. Point a validator at one and check our output, or your own. The formats are yours to implement.
A schema validates structure and nothing else. Nothing here blesses anything: a Sato Score measures how open, active and verifiable a project is, a verified install records that a documented install was reproduced in a container on a date, and a null means unknown rather than zero.
Stability
v1 is additive-only: new optional properties may appear, but an existing property never changes meaning, type or nullability and is never removed. A breaking change is published as v2 at a new URL and v1 keeps serving. Validate with additional properties allowed.
Validate with additional properties allowed. A consumer pinned to v1 must not start failing the day a field is added, which is why every response schema is open and only the sato.deploy manifest — a document other people author, where an unknown key is more likely a typo than a feature — is closed.
Check one
curl -s https://satohub.ai/schemas/export-listing/v1.json -o export-listing.json
curl -s https://satohub.ai/api/export/index.json | jq '.resources[0]' > sample.json
npx ajv-cli validate -s export-listing.json -d sample.json --spec=draft2020The whole catalogue in one request: https://satohub.ai/schemas/index.json.
The formats
Export listing
v1One catalog listing as the free export publishes it — identity, links, chains, standards, score, liveness and deploy manifest. Catalog facts only: no score history, no provenance, no commercial fields, and a score is never a safety or quality judgment.
- Schema
- https://satohub.ai/schemas/export-listing/v1.json
- Sample
- /api/export/index.json
- Announced by
- a $schema property in the body
Change feed
v1The delta a mirror polls instead of re-downloading the catalog: added, updated, changed and removed, with the baseline date to store as a cursor. It is a notification feed, not a guaranteed-complete replication log, and every response says which lanes are approximate.
- Schema
- https://satohub.ai/schemas/change-feed/v1.json
- Sample
- /api/changes?since=2026-09-01
- Announced by
- a $schema property in the body
sato.deploy manifest
v1The minimal manifest for standing a resource up: runtime, install, entry, requirements, and whether the documented install was reproduced in a container. deploy_status records deployability on a date; it is never a safety, quality or audit claim.
- Schema
- https://satohub.ai/schemas/deploy-spec.json
- Sample
- /api/export/index.json
- Announced by
- the document's own top-level version field
Agent Passport manifest
v1The machine-readable passport for one registered agent: identity, declared stack, links, payment metadata and on-chain checks. Registration is self-declared, and a verified wallet proves control of a key rather than anything about the product behind it.
- Schema
- https://satohub.ai/schemas/agent-manifest/v1.json
- Sample
- /api/agents/{slug}/manifest
- Announced by
- a $schema property in the body
Preflight verdict
v1The one call before an agent installs, connects to or pays something: a verdict, the rule that decided it, and every evidence line it rests on. A verdict is a reading of public evidence — go is not a clearance, and unknown is a real answer that is never rounded.
- Schema
- https://satohub.ai/schemas/preflight-verdict/v1.json
- Sample
- /api/preflight?package=solana-agent-kit
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Route receipt
v1The record of one quoted route and, when a caller reports it back, the transaction that carried it. It is an observation, not revenue: the fee is a parameter we sent, amounts are base-unit strings, and receipts must not be summed and called income.
- Schema
- https://satohub.ai/schemas/route-receipt/v1.json
- Sample
- /api/route/receipt
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Signed response envelope
v1The envelope shared by every signed Sato Hub response: the payload plus meta.signature, with the header signature covering the exact bytes. A null signature means the deployment had no key — unsigned is published as unsigned, never as a placeholder.
- Schema
- https://satohub.ai/schemas/signed-envelope/v1.json
- Sample
- /api/export/score-inputs.json
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Build plan
v1A grounded stack for a stated goal: components with their scores, deploy manifests and Preflight verdicts, matching skills with their disclosures, the gaps, and one first action. A recommendation read off public evidence — the gaps are part of the answer, not a failure of it.
- Schema
- https://satohub.ai/schemas/build-plan/v1.json
- Sample
- /api/satobot/plan
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Skill disclosure
v1One agent skill with a static disclosure of what its own text declares: hosts contacted, key generation, credential requests, tool grants. A disclosure describes and never clears; an empty flag list means nothing matched, and a registry's scan belongs to that registry.
- Schema
- https://satohub.ai/schemas/skill-disclosure/v1.json
- Sample
- /api/export/skills.json
- Announced by
- a $schema property in the body
Sato Score inputs
v1Every input the Sato Score is computed from, with the instant the published scores were computed against, so anyone can run the rubric and check our arithmetic. Score it at a later instant and the number legitimately differs — as_of is what makes a reproduction comparable.
- Schema
- https://satohub.ai/schemas/score-inputs/v1.json
- Sample
- /api/export/score-inputs.json
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Score roots
v1One Merkle root per UTC day over the scores published that day, with the exact leaf and node construction and an optional on-chain anchor. A root proves what was published and when; it proves nothing about whether a score is right.
- Schema
- https://satohub.ai/schemas/score-roots/v1.json
- Sample
- /.well-known/sato-score-roots.json
- Announced by
- the document's own top-level version field
Sato Swap quote
v1The answer to one swap request: the venue chosen, the fee disclosed verbatim, the four gate verdicts, the simulation, and either an unsigned transaction or the reason one was withheld. Sato Hub holds no keys and signs nothing; `unknown` refuses by default, and a withheld transaction names the lane that could not be read.
- Schema
- https://satohub.ai/schemas/swap-quote/v1.json
- Sample
- /api/swap/quote
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Swap receipt
v1The public record of one swap decision: the quote, the policy that decided it, the gate verdicts and their digest, and whether the recipient holds a Passport. It is not a claim the trade filled or that anything is safe, and one row is one decision — never a volume figure.
- Schema
- https://satohub.ai/schemas/swap-receipt/v1.json
- Sample
- /api/swap/receipts/{route_id}
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Hub release manifest
v1The public signed record of one published agent package: its file digest, archive byte length, recipe, license and evidence freshness, checkable offline with /verify-release.mjs. A pass means the bytes are what Sato Hub sealed and signed; it is not a review of the code and says nothing about safety or results.
- Schema
- https://satohub.ai/schemas/release/v1.json
- Sample
- /api/listings/{slug}/manifest
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Check custody profile
v1What a package, MCP server, skill, repo or x402 endpoint can do with an agent's keys and funds: does it take the key, does the key leave, can it move funds on its own, what changed — each reading with its evidence class and date. A profile describes what was read and run; it is not a safety rating, and unknown is a real answer.
- Schema
- https://satohub.ai/schemas/custody/v1.json
- Sample
- /api/check?target=npm:viem
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Site facts
v1The public counts every Sato Hub surface quotes — listings, chains, scored and independently checked listings, MCP tools — each with the as_of date of the data behind it. A count describes the catalogue, not our traffic, and is never a judgment of anything counted.
- Schema
- https://satohub.ai/schemas/facts/v1.json
- Sample
- /api/facts.json
- Announced by
- a $schema property in the body
Sato Scan recipient reading
v1The answer to one pre-payment recipient check: the token, look-alike, declared-payee, mark and targeting answers, the S-rule that decided the verdict, and the limits of what was read. It describes what was found inside those limits; `unknown` means no record, never an all-clear, and `go` means declared, canonical and nothing found.
- Schema
- https://satohub.ai/schemas/scan-recipient/v1.json
- Sample
- /api/scan/recipient
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Scan address reading
v1What Sato Scan has on record for one address: marks, campaign ids, declared identities and the roles it holds on the watchlist, with first and last seen. Stored records only; an empty reading means nothing is on record, not that nothing has happened.
- Schema
- https://satohub.ai/schemas/scan-address/v1.json
- Sample
- /api/scan/address?chain=Base&address=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Hub token resolution
v1What an address, a Solana mint or a link from a supported site is: chain, address, name, symbol, decimals, token program, the main pool and its own liquidity, the USD price, and on Solana the mint's authorities and Token-2022 extensions. Every figure names its source and date, and a null names why. It describes; it recommends nothing and says nothing about safety.
- Schema
- https://satohub.ai/schemas/token-resolve/v1.json
- Sample
- /api/token/resolve?input=0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed&chain=base
- Announced by
- a Link: <url>; rel="describedby" response header — the body is signed, so a property would change bytes a verifier was told to hash
Sato Scan finding
v1One detector finding: the wallet it concerns, the look-alike or counterpart, the transaction that shows it, the detector and its method version. A finding describes an observed pattern in public ledger data; it is not a judgment of anyone's intent.
- Schema
- https://satohub.ai/schemas/scan-finding/v1.json
- Sample
- /schemas/scan-finding/v1.json
- Announced by
- the document's own top-level version field
Sato Scan screened reading
v1One screened reading of a wallet or token: what was read, over which window and chains, and what was found inside those limits. Not finding anything is not a statement that nothing exists.
- Schema
- https://satohub.ai/schemas/scan-reading/v1.json
- Sample
- /schemas/scan-reading/v1.json
- Announced by
- the document's own top-level version field
Reusing them
These formats are published so other tools can adopt them, not only so ours can be checked. Copy them, implement them, disagree with them in public. If a schema and the live response disagree, that is our bug — the transparency report is where corrections land.
The methods behind the signed formats are written down too: the sato.deploy manifest and Sato Swap — what is checked, what a verdict means, the fee per venue, and exactly which fields a receipt signature binds.