sarnai-dev · Schema

VerifySchemaResponse

CompanyAIAgentsDirectoryPlatform

Properties

Name Type Description
summary object Compact digest of the verdict: the same `result`, and `blocking_checks` (the distinct check codes that caused a 'fail', empty on 'pass') - for a caller that wants the headline without reading `errors`
next_actions array What to do next, machine-readable. On 'fail': [{"action": "repair_and_reverify", "using": "hints"}, {"action": "withhold_payment", "for": "buyer"}]. On 'pass': [{"action": "attach_receipt", "for": "se
result string
verification_id string Unique UUID (v4) for this verification. Part of the signed attestation and receipt.
task_id string
agent_id object Echo of the agent_id label supplied in the request; null if none. Identifies the AI agent that produced submitted_output (for example, the seller): this attestation and receipt, and any reputation or
output_hash object SHA-256 (64 lowercase hex chars = 32 bytes; add 0x to use it as a bytes32) of the JCS canonical JSON of submitted_output, the data that was verified. Key order and whitespace in what you sent do not c
schema_hash object SHA-256 (64 lowercase hex chars) of the JCS canonical JSON of expected_schema. null only if it has no JCS form.
rules_hash object SHA-256 (64 lowercase hex chars) of the RFC 8785 (JCS) canonical JSON of {"bounds": , "rules": }, containing exactly the fields you sup
request_hash object SHA-256 (64 lowercase hex chars, no 0x prefix) of the RFC 8785 (JCS) canonical JSON of the request as parsed: task_id, agent_id, expected_schema, submitted_output, strict_content_check, bounds, rules,
verified_at string ISO-8601 UTC time this service ran the verification. Identical to attestation.timestamp (the same value, read once); this service's own clock, not an externally verified time.
verifier_version string
enforce_rules boolean Whether the request had enforce_rules on: true means every rule and bound had to hold (violations and unrunnable rules fail the result); false means they were only flags.
strict_content_check boolean Whether the request had strict_content_check on: true means control characters and embedded HTML/script markup in submitted_output failed the result; false means that check did not run.
errors array Every violation (schema, then strict-content, then enforce_rules), capped at the first 100 schema-validation errors; see errors_total / errors_omitted. Non-schema errors (strict-content, enforce_rules
errors_total integer How many errors exist in total. Equal to len(errors) unless the 100-error schema cap above was hit.
errors_omitted integer errors_total minus len(errors); 0 when nothing was cut off.
errors_detail array The structured form of the leading entries in `errors`, same order, so a caller can act (check, path, expected, found) without parsing text; `errors` itself is unchanged, for compatibility. See errors
errors_detail_total integer How many entries in `errors` have a structured form available. Same cap as `hints` (a structured form costs more to build than the text alone).
errors_detail_omitted integer errors_total minus errors_detail_total; 0 when every error has a structured form.
flags array Integrity findings (placeholder text, possible truncation, bounds and consistency-rule violations). severity is 'error' for a finding that enforce_rules made fail the result, 'info' otherwise; either
flags_total integer How many flags exist in total (flags holds at most the first 100, plus a flags_truncated marker when there are more), counting an unhashable_input flag if present.
flags_omitted integer Integrity flags beyond the 100 returned; 0 when nothing was cut off.
hints array Machine-actionable, template-based fix hints: one per schema validation failure (first, in the same order as `errors`), then per strict-content failure and integrity flag. At most 20; see hints_total
hints_total integer How many hints exist in total (hints holds at most the first 20).
hints_omitted integer hints_total minus len(hints).
schema_compliance object JSON Schema assertions that passed out of those evaluated (each keyword such as type/required/minimum, at each place it applies; anyOf/oneOf/not/if count once, applicators like properties and items ar
integrity_checks object Integrity checks that passed out of those evaluated (per string: placeholder and truncation, plus strict content when enabled; per schema-described object: completeness; per configured bound and consi
overall object A pooled count across both groups: (schema_compliance.passed + integrity_checks.passed) / (schema_compliance.total + integrity_checks.total), with those two sums as passed and total. It is NOT an aver
verify object How to verify this attestation and receipt without any other lookup than this response and public_key_url: canonicalization and hash algorithm behind every hash and the signature itself, this service'
attestation object Ed25519 signature over this response (every field above, including the receipt fields) plus the timestamp and key_version. The timestamp is this service's own clock, not an externally verified one. Pu
View JSON Schema on GitHub

JSON Schema

sarnai-dev-verify-schema-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/sarnai-dev/json-schema/sarnai-dev-verify-schema-response-schema.json",
  "title": "VerifySchemaResponse",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/verify-openapi.json#/components/schemas/VerifySchemaResponse",
  "properties": {
    "summary": {
      "$ref": "#/$defs/Summary",
      "description": "Compact digest of the verdict: the same `result`, and `blocking_checks` (the distinct check codes that caused a 'fail', empty on 'pass') - for a caller that wants the headline without reading `errors`/`flags`."
    },
    "next_actions": {
      "items": {
        "additionalProperties": {
          "type": "string"
        },
        "type": "object"
      },
      "type": "array",
      "title": "Next Actions",
      "description": "What to do next, machine-readable. On 'fail': [{\"action\": \"repair_and_reverify\", \"using\": \"hints\"}, {\"action\": \"withhold_payment\", \"for\": \"buyer\"}]. On 'pass': [{\"action\": \"attach_receipt\", \"for\": \"seller\"}, {\"action\": \"proceed_to_payment\", \"for\": \"buyer\"}], plus a {\"action\": \"consider_enforce_rules\", \"note\": ...} entry when enforce_rules is false (only the JSON Schema was checked). A plain list of string-keyed objects (not a stricter per-action model): the two shapes share only `action`, and a `for` field could not be a Python attribute name without an alias that REST and MCP risk serializing differently."
    },
    "result": {
      "type": "string",
      "enum": [
        "pass",
        "fail"
      ],
      "title": "Result"
    },
    "verification_id": {
      "type": "string",
      "title": "Verification Id",
      "description": "Unique UUID (v4) for this verification. Part of the signed attestation and receipt."
    },
    "task_id": {
      "type": "string",
      "title": "Task Id"
    },
    "agent_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Agent Id",
      "description": "Echo of the agent_id label supplied in the request; null if none. Identifies the AI agent that produced submitted_output (for example, the seller): this attestation and receipt, and any reputation or trust score it feeds, belongs to that producer. It is an unauthenticated label chosen by the caller, not a proven identity, and not the identity of whoever called this endpoint."
    },
    "output_hash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Output Hash",
      "description": "SHA-256 (64 lowercase hex chars = 32 bytes; add 0x to use it as a bytes32) of the JCS canonical JSON of submitted_output, the data that was verified. Key order and whitespace in what you sent do not change it. null only if it has no JCS form (NaN/Infinity, a lone surrogate)."
    },
    "schema_hash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Schema Hash",
      "description": "SHA-256 (64 lowercase hex chars) of the JCS canonical JSON of expected_schema. null only if it has no JCS form."
    },
    "rules_hash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Rules Hash",
      "description": "SHA-256 (64 lowercase hex chars) of the RFC 8785 (JCS) canonical JSON of {\"bounds\": <the bounds you supplied or null>, \"rules\": <the rules you supplied or null>}, containing exactly the fields you supplied (fields left at their defaults are not included), so you can hash your own rules JSON in that shape and compare. It lets a buyer confirm which rules were applied. null when no bounds or rules were supplied (or they contain NaN/Infinity)."
    },
    "request_hash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Request Hash",
      "description": "SHA-256 (64 lowercase hex chars, no 0x prefix) of the RFC 8785 (JCS) canonical JSON of the request as parsed: task_id, agent_id, expected_schema, submitted_output, strict_content_check, bounds, rules, enforce_rules, with defaults filled in (agent_id/bounds/rules null, strict_content_check and enforce_rules false). Inside bounds and rules, every PER-RULE field is also filled to its own default, not just the ones you supplied: an omitted consistency-rule field hashes as equals_field/equals/other_field/value/in_field/values: null, tolerance: 1e-9, if_present: false, and an omitted bound field hashes as if_present: false - so two requests whose rules/bounds differ only by which optional fields were typed out still hash identically here. This is the opposite convention from rules_hash (below), which hashes exactly and only the fields you supplied, with nothing defaulted in - hash your own rules JSON in rules_hash's documented shape if you need to confirm which rules were applied without re-deriving every default. null only if the request contains data with no JCS form (NaN/Infinity, a lone surrogate). Not part of the 'compact' detail level."
    },
    "verified_at": {
      "type": "string",
      "title": "Verified At",
      "description": "ISO-8601 UTC time this service ran the verification. Identical to attestation.timestamp (the same value, read once); this service's own clock, not an externally verified time."
    },
    "verifier_version": {
      "type": "string",
      "title": "Verifier Version"
    },
    "enforce_rules": {
      "type": "boolean",
      "title": "Enforce Rules",
      "description": "Whether the request had enforce_rules on: true means every rule and bound had to hold (violations and unrunnable rules fail the result); false means they were only flags."
    },
    "strict_content_check": {
      "type": "boolean",
      "title": "Strict Content Check",
      "description": "Whether the request had strict_content_check on: true means control characters and embedded HTML/script markup in submitted_output failed the result; false means that check did not run."
    },
    "errors": {
      "items": {
        "type": "string"
      },
      "type": "array",
      "title": "Errors",
      "description": "Every violation (schema, then strict-content, then enforce_rules), capped at the first 100 schema-validation errors; see errors_total / errors_omitted. Non-schema errors (strict-content, enforce_rules) are never capped. Not part of the 'compact' detail level."
    },
    "errors_total": {
      "type": "integer",
      "title": "Errors Total",
      "description": "How many errors exist in total. Equal to len(errors) unless the 100-error schema cap above was hit."
    },
    "errors_omitted": {
      "type": "integer",
      "title": "Errors Omitted",
      "description": "errors_total minus len(errors); 0 when nothing was cut off."
    },
    "errors_detail": {
      "items": {
        "$ref": "#/$defs/ErrorDetail"
      },
      "type": "array",
      "title": "Errors Detail",
      "description": "The structured form of the leading entries in `errors`, same order, so a caller can act (check, path, expected, found) without parsing text; `errors` itself is unchanged, for compatibility. See errors_detail_total / errors_detail_omitted for how many entries in `errors` this covers."
    },
    "errors_detail_total": {
      "type": "integer",
      "title": "Errors Detail Total",
      "description": "How many entries in `errors` have a structured form available. Same cap as `hints` (a structured form costs more to build than the text alone)."
    },
    "errors_detail_omitted": {
      "type": "integer",
      "title": "Errors Detail Omitted",
      "description": "errors_total minus errors_detail_total; 0 when every error has a structured form."
    },
    "flags": {
      "items": {
        "$ref": "#/$defs/Flag"
      },
      "type": "array",
      "title": "Flags",
      "description": "Integrity findings (placeholder text, possible truncation, bounds and consistency-rule violations). severity is 'error' for a finding that enforce_rules made fail the result, 'info' otherwise; either way, a flag never itself changes 'result' - it is `errors` that does. Not part of the 'compact' detail level."
    },
    "flags_total": {
      "type": "integer",
      "title": "Flags Total",
      "description": "How many flags exist in total (flags holds at most the first 100, plus a flags_truncated marker when there are more), counting an unhashable_input flag if present."
    },
    "flags_omitted": {
      "type": "integer",
      "title": "Flags Omitted",
      "description": "Integrity flags beyond the 100 returned; 0 when nothing was cut off."
    },
    "hints": {
      "items": {
        "$ref": "#/$defs/Hint"
      },
      "type": "array",
      "title": "Hints",
      "description": "Machine-actionable, template-based fix hints: one per schema validation failure (first, in the same order as `errors`), then per strict-content failure and integrity flag. At most 20; see hints_total / hints_omitted. Where, what was expected, what was found. Never a guessed corrected value. Not part of the 'compact' detail level."
    },
    "hints_total": {
      "type": "integer",
      "title": "Hints Total",
      "description": "How many hints exist in total (hints holds at most the first 20)."
    },
    "hints_omitted": {
      "type": "integer",
      "title": "Hints Omitted",
      "description": "hints_total minus len(hints)."
    },
    "schema_compliance": {
      "$ref": "#/$defs/SubScore",
      "description": "JSON Schema assertions that passed out of those evaluated (each keyword such as type/required/minimum, at each place it applies; anyOf/oneOf/not/if count once, applicators like properties and items are not counted themselves). A separate figure from integrity_checks: the two ratios are never averaged (see `overall` for the pooled count). Informational: `result` is decided by errors, not by this. Not part of the 'compact' detail level."
    },
    "integrity_checks": {
      "$ref": "#/$defs/SubScore",
      "description": "Integrity checks that passed out of those evaluated (per string: placeholder and truncation, plus strict content when enabled; per schema-described object: completeness; per configured bound and consistency-rule comparison). Informational: only strict_content_check failures (and enforce_rules violations, if enabled) can change `result`. Not part of the 'compact' detail level."
    },
    "overall": {
      "$ref": "#/$defs/SubScore",
      "description": "A pooled count across both groups: (schema_compliance.passed + integrity_checks.passed) / (schema_compliance.total + integrity_checks.total), with those two sums as passed and total. It is NOT an average of the two ratios (the larger group weighs more), and it says nothing about whether the content is right. null ratio when the total is 0. Informational only: never changes `result`. Not part of the 'compact' detail level."
    },
    "verify": {
      "$ref": "#/$defs/VerifySection",
      "description": "How to verify this attestation and receipt without any other lookup than this response and public_key_url: canonicalization and hash algorithm behind every hash and the signature itself, this service's name, and its MCP endpoint."
    },
    "attestation": {
      "$ref": "#/$defs/Attestation",
      "description": "Ed25519 signature over this response (every field above, including the receipt fields) plus the timestamp and key_version. The timestamp is this service's own clock, not an externally verified one. Public key and verification steps: /.well-known/agent-card.json, capabilities.extensions (attestation entry)."
    }
  },
  "type": "object",
  "required": [
    "summary",
    "next_actions",
    "result",
    "verification_id",
    "task_id",
    "agent_id",
    "output_hash",
    "schema_hash",
    "rules_hash",
    "request_hash",
    "verified_at",
    "verifier_version",
    "enforce_rules",
    "strict_content_check",
    "errors",
    "errors_total",
    "errors_omitted",
    "errors_detail_total",
    "errors_detail_omitted",
    "flags_total",
    "flags_omitted",
    "hints",
    "hints_total",
    "hints_omitted",
    "schema_compliance",
    "integrity_checks",
    "overall",
    "verify",
    "attestation"
  ],
  "$defs": {
    "Attestation": {
      "properties": {
        "algorithm": {
          "type": "string",
          "const": "Ed25519",
          "title": "Algorithm"
        },
        "key_version": {
          "type": "string",
          "title": "Key Version"
        },
        "timestamp": {
          "type": "string",
          "title": "Timestamp"
        },
        "signature": {
          "type": "string",
          "title": "Signature"
        }
      },
      "type": "object",
      "required": [
        "algorithm",
        "key_version",
        "timestamp",
        "signature"
      ],
      "title": "Attestation"
    },
    "ErrorDetail": {
      "properties": {
        "check": {
          "type": "string",
          "title": "Check",
          "description": "Same meaning as Hint.check."
        },
        "path": {
          "type": "string",
          "title": "Path",
          "description": "Same meaning as Hint.path."
        },
        "expected": {
          "type": "string",
          "title": "Expected",
          "description": "Same meaning as Hint.expected."
        },
        "found": {
          "type": "string",
          "title": "Found",
          "description": "Same meaning as Hint.found."
        },
        "message": {
          "type": "string",
          "title": "Message",
          "description": "The matching entry in `errors`, verbatim."
        }
      },
      "type": "object",
      "required": [
        "check",
        "path",
        "expected",
        "found",
        "message"
      ],
      "title": "ErrorDetail",
      "description": "The structured form of one entry in `errors`, at the same index, so a caller can act\non a violation without parsing its text (verifier_version 0.4.0). Same shape as the\nmatching `Hint` (check, path, expected, found), plus the original text for compatibility.\nOnly the first errors_detail_total entries get one, same cap as hints (MAX_DETAILS /\nMAX_STRICT_ERRORS below) - a formatted string is far cheaper to keep than a structured\none; see errors_detail_total / errors_detail_omitted."
    },
    "Flag": {
      "properties": {
        "check": {
          "type": "string",
          "title": "Check"
        },
        "field": {
          "type": "string",
          "title": "Field"
        },
        "severity": {
          "type": "string",
          "enum": [
            "info",
            "error"
          ],
          "title": "Severity",
          "description": "'error' when enforce_rules made this specific bound/rule finding fail the result (see VerifySchemaRequest.enforce_rules); 'info' otherwise. Never affects `result` itself - `result` is decided by `errors`, of which this finding is then also a member.",
          "default": "info"
        },
        "detail": {
          "type": "string",
          "title": "Detail"
        }
      },
      "type": "object",
      "required": [
        "check",
        "field",
        "detail"
      ],
      "title": "Flag"
    },
    "Hint": {
      "properties": {
        "source": {
          "type": "string",
          "enum": [
            "schema",
            "integrity"
          ],
          "title": "Source",
          "description": "'schema': a JSON Schema validation failure (one per entry in `errors`, same order). 'integrity': a strict-content failure or an informational flag."
        },
        "check": {
          "type": "string",
          "title": "Check",
          "description": "The JSON Schema keyword that failed (type, required, minimum, ...), or the integrity check (strict_content_check, placeholder_content, truncation, bounds, consistency:*, unhashable_input)."
        },
        "path": {
          "type": "string",
          "title": "Path",
          "description": "Where, as a JSON path: '$.items[3].price'. For a missing required property, the path where it should be. Integrity hints use the flag's own field notation with a '$.' prefix."
        },
        "expected": {
          "type": "string",
          "title": "Expected",
          "description": "What the check wanted at that path, from a fixed template (e.g. 'number')."
        },
        "found": {
          "type": "string",
          "title": "Found",
          "description": "What was there instead, from a fixed template (e.g. 'string', 'missing', '-1'). Long values are shortened; whole values are never echoed."
        }
      },
      "type": "object",
      "required": [
        "source",
        "check",
        "path",
        "expected",
        "found"
      ],
      "title": "Hint"
    },
    "SubScore": {
      "properties": {
        "ratio": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Ratio",
          "description": "passed / total, a raw float in [0, 1]; null when total is 0 (nothing was checked). Informational only: never affects `result`."
        },
        "passed": {
          "type": "integer",
          "title": "Passed"
        },
        "total": {
          "type": "integer",
          "title": "Total"
        }
      },
      "type": "object",
      "required": [
        "ratio",
        "passed",
        "total"
      ],
      "title": "SubScore"
    },
    "Summary": {
      "properties": {
        "result": {
          "type": "string",
          "enum": [
            "pass",
            "fail"
          ],
          "title": "Result",
          "description": "Same value as the top-level `result`."
        },
        "blocking_checks": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "title": "Blocking Checks",
          "description": "Distinct check codes that caused 'fail' (the same codes used in `errors_detail[].check`, `flags[].check` and `hints[].check`), in first-seen order; empty on 'pass'."
        }
      },
      "type": "object",
      "required": [
        "result",
        "blocking_checks"
      ],
      "title": "Summary",
      "description": "Compact digest of the verdict, for a caller that wants the headline without reading\n`errors`/`flags` (verifier_version 0.4.0)."
    },
    "VerifySection": {
      "properties": {
        "public_key_url": {
          "type": "string",
          "title": "Public Key Url",
          "description": "Agent-card URL listing the public key for key_version below, and every key this service has ever signed with."
        },
        "key_version": {
          "type": "string",
          "title": "Key Version",
          "description": "Matches attestation.key_version."
        },
        "canonicalization": {
          "type": "string",
          "title": "Canonicalization",
          "description": "How every hash below, and the signed bytes themselves, are computed."
        },
        "hash_algorithm": {
          "type": "string",
          "title": "Hash Algorithm",
          "description": "Algorithm behind every *_hash field in this response."
        },
        "service": {
          "type": "string",
          "title": "Service",
          "description": "This service's name."
        },
        "mcp": {
          "type": "string",
          "title": "Mcp",
          "description": "This service's MCP (Model Context Protocol) endpoint."
        }
      },
      "type": "object",
      "required": [
        "public_key_url",
        "key_version",
        "canonicalization",
        "hash_algorithm",
        "service",
        "mcp"
      ],
      "title": "VerifySection",
      "description": "Compact, self-describing block every signed attestation and receipt carries (2026-09-30,\nverifier_version 0.4.0) - inside the signature, alongside `attestation` itself - so a\nverifier needs nothing but this response and the URL below, not a separate lookup or\nprior knowledge of this service's conventions."
    }
  }
}

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/sarnai-dev-verify-schema-response"
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.