Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/satohub-ai:satohub-ai-claims-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Sato Hub public Claims API
version: 1.1.0
summary: Read access to the onchain agent library, its change feed, and the Agent Passport registry.
description: 'Public reads need no key and no account; the projects and listings routes take a bearer key. A Sato API key is optional on every metered endpoint and only raises limits. What is free, what is paid (the plans are Sato Check Team and Platform & Data), every limit and the fee schedule are listed on the pricing page, and the same sheet is machine-readable at /api/pricing.json.
Pricing: https://satohub.ai/pricing
License: Catalog data CC-BY-4.0 — attribution: data by satohub.ai. Scores/liveness are informational signals, not safety or quality guarantees.
Scores 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.
Every shape this API returns is also published as a versioned JSON Schema (draft 2020-12) at https://satohub.ai/schemas — catalogue at https://satohub.ai/schemas/index.json. They are referenced from components.schemas below, and v1 is additive-only: a breaking change becomes v2 at a new URL. Validate with additional properties allowed.
The 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.
INTERPRETED ANSWERS. A route template sent literally (`{slug}`), an empty query or body, a parameter under another name (`?package=` for `?target=`) or another spelling of a chain (`8453`, `eth`, `bsc`) is answered with the closest honest thing instead of a bare 4xx, and always LABELLED: the body carries an `interpretation` object (`interpreted_as`, `requested`, `rule`, `note`; the same four keys are repeated at the top level when they cannot collide with the record''s own fields), and the response carries the header `X-Sato-Interpreted: ` (plus `Content-Location` when there is a canonical URL). An interpreted answer is never an exact match. Nothing that moves money is ever interpreted beyond a chain spelling: no amount, token, taker, recipient, deployer or slippage is defaulted, a missing chain is never assumed, a chain is never guessed from an address, and a generic network word (`mainnet`, `testnet`) is never read as a chain (the answer lists the candidates). Writes are never interpreted, and a receipt is never served for a template.'
contact:
name: Sato Hub
url: https://satohub.ai
x-guidance: 'Free: search and read the onchain-agent catalog (/api/export/index.json, /api/changes, /api/resolve) and use the MCP server at /api/mcp. Paid over x402 (USDC on Base, no account or key): GET /api/x402/history/{slug} for one listing''s daily Sato Score record, GET /api/x402/agent-economy for the weekly agent-economy series. Each paid read is priced per unit delivered (daily points or rows returned): the 402 states the exact amount, the unit, the quantity and the formula, which is also on /pricing. The Sato Score measures how open, active and verifiable a project is; it is not a safety or returns grade.'
x-status:
page: https://satohub.ai/status/sato-hub
json: https://satohub.ai/api/status.json
feed: https://satohub.ai/status/feed.xml
note: Success ratios and latencies of Sato Hub's own hourly checks. Not a service-level agreement.
license:
name: CC-BY-4.0
url: https://creativecommons.org/licenses/by/4.0/
servers:
- url: https://satohub.ai
security: []
tags:
- name: Claims
description: Maintainers proving control of a listing they own.
paths:
/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
description: 'The target''s identity: a hostname, or github.com/<owner>/<repo> for a repo target.'
kind:
type: string
enum:
- domain
- repo
source:
type: string
token:
type: string
dnsName:
type: string
description: Domain targets only.
fileUrl:
type: string
format: uri
description: Domain targets only.
repo:
type: string
description: 'Repo targets only: <owner>/<repo>.'
repoPath:
type: string
description: 'Repo targets only: the path the file must live at on the default branch.'
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., or the token served at https:///.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.
A 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
- repo
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.
Edits 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.
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'Two different credentials ride this header, and they are told apart by their shape.
• A SATO API KEY, `sk_sato_…` — optional on every metered endpoint. It is NEVER required: each of those endpoints answers an anonymous caller at the free limits, and a key only raises the caps and attributes the calls to an account. A key may also be sent as `X-Sato-Key`. An unknown or revoked key is served as if no key were present, never refused. Limits and plans: /pricing.
• A PRIVY ACCESS TOKEN for a signed-in account — required by the claim endpoints and the key-management endpoints. A token that is not a Sato key is treated as one of these.'
satoKey:
type: apiKey
in: header
name: X-Sato-Key
description: 'The same optional Sato API key, on its own header. Equivalent to `Authorization: Bearer sk_sato_…`.'
externalDocs:
description: The published Sato Hub formats, as JSON Schema.
url: https://satohub.ai/schemas