satohub-ai · Schema

Sealed agent version (sato.version/v1)

One immutable, sealed version of a private agent project: what was built, from which exact files, under which declared runtime, permissions and licences, and whether the platform could sign the manifest. This describes a RECORD, not a guarantee — a sealed version has not been executed, installed or reviewed by anything unless a version_evidence row says so, and evidence written by the creator is labelled as the creator's own statement. `signature: null` with `signing: "unavailable"` is a supported, honest state and means no signing key was configured; it is never a placeholder signature.

CompanyAIBlockchainCryptoAgent

Properties

Name Type Description
id string
project_id string
schema_version integer
parent_version_id stringnull The version this one was derived from. Always a version of the SAME project — a composite foreign key enforces it.
artifact_digest string sha256 over the sealed files: each (path, content) pair length-prefixed, sorted by path. Order-independent and byte-sensitive. Recomputable from the downloaded archive; that recomputation is the exit
artifact_bytes integer
manifest object The composed manifest the version was sealed from — the object `meta.signature` covers, and the file GET /api/versions/{id}/manifest serves unchanged. Versions sealed from Release 1.2 onward also carr
dependency_lock objectnull The exact resolved dependency tree, when the package carries one. Null means no lock was sealed, not that dependencies are unpinned by policy.
io_schemas object
runtime object Declared runtime and entrypoint. Declared: nothing in A1 executes it.
model_policy objectnull recommended / candidates / evaluated. CANDIDATES ARE CONFIGURED CHOICES, not evidence of compatibility. A model enters `evaluated` only through a recipe-specific evaluation run recorded as evidence.
capabilities array
requested_permissions array What the package asks for. Requested, not granted.
declared_secret_names array NAMES ONLY. A secret value never enters a version row, a manifest, a package, a log or a transcript.
licenses array
provenance object
signature objectnull Ed25519 (EdDSA) over the canonical manifest, the same construction as every other signed Sato Hub surface (lib/signing.ts). Null when no signing key is configured.
signing object "unavailable" is a documented, supported state — no signing key was configured when this version was sealed. A verifier must treat it as unsigned, never as invalid and never as trusted.
sealed_at string
ops object Mutable operational metadata, kept OUTSIDE the sealed row so that "the version never changes" can be absolute.
evidence array Observations about THIS exact digest. An empty array means nothing has been observed — which is not a pass and not a failure.
View JSON Schema on GitHub

JSON Schema

satohub-ai-version-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/satohub-ai/json-schema/satohub-ai-version-schema.json",
  "title": "Sealed agent version (sato.version/v1)",
  "description": "One immutable, sealed version of a private agent project: what was built, from which exact files, under which declared runtime, permissions and licences, and whether the platform could sign the manifest. This describes a RECORD, not a guarantee — a sealed version has not been executed, installed or reviewed by anything unless a version_evidence row says so, and evidence written by the creator is labelled as the creator's own statement. `signature: null` with `signing: \"unavailable\"` is a supported, honest state and means no signing key was configured; it is never a placeholder signature.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/satohub-ai-openapi.json#/components/schemas/version",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "id",
    "project_id",
    "schema_version",
    "artifact_digest",
    "artifact_bytes",
    "manifest",
    "io_schemas",
    "runtime",
    "declared_secret_names",
    "signing",
    "sealed_at"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "project_id": {
      "type": "string",
      "format": "uuid"
    },
    "schema_version": {
      "type": "integer",
      "minimum": 1
    },
    "parent_version_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "The version this one was derived from. Always a version of the SAME project — a composite foreign key enforces it."
    },
    "artifact_digest": {
      "type": "string",
      "pattern": "^sha256:[0-9a-f]{64}$",
      "description": "sha256 over the sealed files: each (path, content) pair length-prefixed, sorted by path. Order-independent and byte-sensitive. Recomputable from the downloaded archive; that recomputation is the exit check."
    },
    "artifact_bytes": {
      "type": "integer",
      "minimum": 1
    },
    "manifest": {
      "type": "object",
      "description": "The composed manifest the version was sealed from — the object `meta.signature` covers, and the file GET /api/versions/{id}/manifest serves unchanged. Versions sealed from Release 1.2 onward also carry the sealed claims (capabilities, requested_permissions, declared_secret_names, runtime, model_policy, io_schemas, dependency_lock_sha256) so the signature binds what the package asks for, not only its files; a manifest sealed earlier lacks those keys and still verifies. Verify offline with verify-release.mjs.",
      "additionalProperties": true,
      "properties": {
        "schema": {
          "const": "sato.version/v1"
        },
        "artifact_digest": {
          "type": "string",
          "pattern": "^sha256:[0-9a-f]{64}$"
        },
        "artifact_bytes": {
          "type": "integer",
          "minimum": 1,
          "description": "The byte length of the stored zip archive (not of the files)."
        },
        "project_id": {
          "type": "string",
          "format": "uuid"
        },
        "capabilities": {
          "type": "array",
          "items": {}
        },
        "requested_permissions": {
          "type": "array",
          "items": {},
          "description": "Requested, not granted."
        },
        "declared_secret_names": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "NAMES ONLY."
        },
        "runtime": {
          "type": "object",
          "additionalProperties": true
        },
        "model_policy": {
          "type": [
            "object",
            "null"
          ],
          "additionalProperties": true
        },
        "io_schemas": {
          "type": "object",
          "additionalProperties": true
        },
        "dependency_lock_sha256": {
          "type": [
            "string",
            "null"
          ],
          "pattern": "^[0-9a-f]{64}$",
          "description": "sha256 (hex) of the dependency lock serialised as canonical JSON (object keys sorted by code point, arrays in order, no whitespace — the construction in lib/signing.ts). Null means no lock was sealed, not that dependencies are unpinned by policy."
        },
        "meta": {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "schema_url": {
              "type": "string"
            },
            "signature": {
              "type": [
                "object",
                "null"
              ],
              "additionalProperties": true,
              "description": "Ed25519 over utf8(signed_at) || 0x0A || canonicalJson(manifest with meta.signature removed). Null when no signing key was configured: unsigned, never invalid and never trusted."
            }
          }
        }
      }
    },
    "dependency_lock": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": true,
      "description": "The exact resolved dependency tree, when the package carries one. Null means no lock was sealed, not that dependencies are unpinned by policy."
    },
    "io_schemas": {
      "type": "object",
      "additionalProperties": true
    },
    "runtime": {
      "type": "object",
      "additionalProperties": true,
      "description": "Declared runtime and entrypoint. Declared: nothing in A1 executes it."
    },
    "model_policy": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": true,
      "description": "recommended / candidates / evaluated. CANDIDATES ARE CONFIGURED CHOICES, not evidence of compatibility. A model enters `evaluated` only through a recipe-specific evaluation run recorded as evidence.",
      "properties": {
        "recommended": {
          "type": "string"
        },
        "candidates": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "evaluated": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        }
      }
    },
    "capabilities": {
      "type": "array",
      "items": {}
    },
    "requested_permissions": {
      "type": "array",
      "items": {},
      "description": "What the package asks for. Requested, not granted."
    },
    "declared_secret_names": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "NAMES ONLY. A secret value never enters a version row, a manifest, a package, a log or a transcript."
    },
    "licenses": {
      "type": "array",
      "items": {}
    },
    "provenance": {
      "type": "object",
      "additionalProperties": true
    },
    "signature": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": true,
      "description": "Ed25519 (EdDSA) over the canonical manifest, the same construction as every other signed Sato Hub surface (lib/signing.ts). Null when no signing key is configured.",
      "properties": {
        "alg": {
          "const": "EdDSA"
        },
        "kid": {
          "type": "string"
        },
        "sig": {
          "type": "string"
        },
        "signed_at": {
          "type": "string",
          "format": "date-time"
        },
        "jwks_url": {
          "type": "string",
          "format": "uri"
        },
        "canonicalization": {
          "type": "string"
        }
      }
    },
    "signing": {
      "enum": [
        "signed",
        "unavailable"
      ],
      "description": "\"unavailable\" is a documented, supported state — no signing key was configured when this version was sealed. A verifier must treat it as unsigned, never as invalid and never as trusted."
    },
    "sealed_at": {
      "type": "string",
      "format": "date-time"
    },
    "ops": {
      "type": "object",
      "description": "Mutable operational metadata, kept OUTSIDE the sealed row so that \"the version never changes\" can be absolute.",
      "additionalProperties": true,
      "properties": {
        "display_label": {
          "type": [
            "string",
            "null"
          ]
        },
        "last_exported_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "export_count": {
          "type": "integer",
          "minimum": 0
        }
      }
    },
    "evidence": {
      "type": "array",
      "description": "Observations about THIS exact digest. An empty array means nothing has been observed — which is not a pass and not a failure.",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "id",
          "test_id",
          "result",
          "label",
          "source",
          "observed_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "test_id": {
            "type": "string"
          },
          "test_version": {
            "type": "string"
          },
          "environment_digest": {
            "type": [
              "string",
              "null"
            ]
          },
          "result": {
            "enum": [
              "pass",
              "fail",
              "unknown"
            ],
            "description": "`unknown` is a first-class outcome. With reason_code `isolation_unavailable` it means nothing ran, and it must never be rendered as a failure."
          },
          "reason_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "label": {
            "enum": [
              "generated",
              "install-tested",
              "integration-tested",
              "task-tested",
              "user-reported",
              "simulation",
              "observed-execution"
            ]
          },
          "source": {
            "enum": [
              "platform",
              "creator"
            ],
            "description": "Derived from the credential that wrote the row, never from the request body. A creator may only carry `user-reported` or `generated`."
          },
          "runner_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "observed_at": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "trace_ref": {
            "type": [
              "string",
              "null"
            ]
          },
          "details": {
            "type": "object",
            "additionalProperties": true
          }
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema 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 schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • 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 JSON Schema
curl "https://apis.io/api/v1/json-schemas/satohub-ai-version"
All schemas
curl "https://apis.io/api/v1/json-schemas?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.