satohub-ai Badges API

Embeddable badges — SVG, or the shields.io endpoint-badge JSON. No key, hotlinkable.

Operations 3

GET /api/badge/{slug}.json Sato Score badge (shields.io endpoint JSON) #
GET /api/badge/{slug} Sato Score badge (SVG) #
GET /api/agents/{slug}/badge Registered-on-Sato-Hub badge (SVG) #

Work with this as data

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-badges-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 Specification

satohub-ai-badges-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Sato Hub public Badges 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: Badges
  description: Embeddable badges — SVG, or the shields.io endpoint-badge JSON. No key, hotlinkable.
paths:
  /api/badge/{slug}.json:
    get:
      tags:
      - Badges
      operationId: getResourceBadgeJson
      summary: Sato Score badge (shields.io endpoint JSON)
      description: 'The same badge as the SVG, in the shields.io endpoint-badge schema (schemaVersion 1, label, message, color). Render it anywhere shields renders: https://img.shields.io/endpoint?url=https%3A%2F%2Fsatohub.ai%2Fapi%2Fbadge%2F{slug}.json . `message` is the score (with ✓ when an evidence-gated verification state is earned) or `provisional`; `color` is the tier colour. The extra fields `verify_url`, `sato_url` and `caveat` are ignored by shields and kept for machines reading the JSON directly. 404 (with isError) for an unknown, deprecated or non-scoreable listing. The route TEMPLATE itself (`{slug}` sent literally) answers 200 with a neutral `message: template` and no score, labelled `rule: template-placeholder` (header X-Sato-Interpreted).'
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
        example: coinbase-agentkit
        description: A listing slug from /api/export/index.json.
      responses:
        '200':
          description: The badge data.
          content:
            application/json:
              schema:
                type: object
                required:
                - schemaVersion
                - label
                - message
                - color
                properties:
                  schemaVersion:
                    type: integer
                    enum:
                    - 1
                  label:
                    type: string
                  message:
                    type: string
                  color:
                    type: string
                    description: 'Hex without #, or a shields colour name.'
                  labelColor:
                    type: string
                  namedLogo:
                    type: string
                  verify_url:
                    type: string
                    format: uri
                  sato_url:
                    type: string
                    format: uri
                  caveat:
                    type: string
        '404':
          description: 'Unknown or non-scoreable slug; body carries isError: true.'
  /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 never renders broken. Non-scoreable means editorial listings — research papers, newsletters, communities — which carry no score by design. The route TEMPLATE itself (`{slug}` sent literally) answers 200 with a neutral badge that shows no score (header X-Sato-Interpreted: template-placeholder).'
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
        example: coinbase-agentkit
        description: A listing slug from /api/export/index.json.
      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. The route TEMPLATE itself (`{slug}` sent literally) answers 200 with a neutral badge that makes no claim (header X-Sato-Interpreted: template-placeholder).'
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
        example: satobot
        description: A registered agent's slug.
      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
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