gunspec-io · Schema

ApiContractRun

One run of the contract suite: every documented operation called against this API and held against this document. Produced by `scripts/smoke/` in CI. Uptime is a separate question and a separate system - this says whether what the API answers is still what the reference promises.

FirearmsAPIDatabaseSpecificationsSDKMCP

Properties

Name Type Description
surface string What the run measured: `api` for this REST API, `mcp` for the hosted MCP server, `fitment` for the attachment compatibility suite, `catalogue` for the catalogue record checks: every file against its s
env string Which environment was measured: `production`, `staging` or `local`. A staging run is never mixed into production, because a report read as evidence about the wrong environment is worse than no report.
specVersion stringnull The version of this document the run was measured against, so a result names the contract it was true of.
commitSha stringnull The commit of our repository the run started from, or null where CI did not report one.
runUrl stringnull The CI run, where it is reachable.
ranAt string When the run finished, ISO 8601.
durationMs integer Wall-clock time the whole sweep took, in milliseconds.
operations integer How many documented operations the run covered.
passed integer Operations where every check that ran passed.
failed integer Operations where at least one check failed. One endpoint failing three ways is one unhealthy endpoint, not three.
skipped integer Operations nothing could be asked about: no key for that gate, a write the suite will not send against a live host, or a fixture it could not resolve. Never folded into `passed`.
tiers array The plans the run held a key for. The tier checks can only cover a gate the run could call, so this is what separates "every gate was proven" from "we had one key".
results array One entry per documented operation.
systemChecks array The same run reduced to questions about the API as a whole rather than about one endpoint: whether any response carries JSON inside a string, whether every gate still refuses a keyless call, whether e
View JSON Schema on GitHub

JSON Schema

gunspec-io-api-contract-run-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/gunspec-io/json-schema/gunspec-io-api-contract-run-schema.json",
  "title": "ApiContractRun",
  "description": "One run of the contract suite: every documented operation called against this API and held against this document. Produced by `scripts/smoke/` in CI. Uptime is a separate question and a separate system - this says whether what the API answers is still what the reference promises.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/gunspec-io-openapi.json#/components/schemas/ApiContractRun",
  "type": "object",
  "properties": {
    "surface": {
      "type": "string",
      "enum": [
        "api",
        "mcp",
        "fitment",
        "catalogue",
        "integrity",
        "plausibility",
        "anomalies",
        "cartridges",
        "materials",
        "corroboration",
        "sources",
        "manufacturers",
        "links"
      ],
      "description": "What the run measured: `api` for this REST API, `mcp` for the hosted MCP server, `fitment` for the attachment compatibility suite, `catalogue` for the catalogue record checks: every file against its schema, no company under two ids, and no firearm whose fields cannot all be true, `integrity` for the integrity checks: figures, prose and feature lists copied between unrelated guns, citations that are not evidence, timelines, weight against size, and confidence against evidence, `plausibility` for the plausibility checks: a loaded weight against the empty one and its magazine, a gun older than its cartridge, figures in the wrong unit, energy against velocity, variants that disagree with their family, and the same gun filed twice, `anomalies` for the statistical anomaly checks: a figure unusually far from its family's or its cohort's median, and a barrel an unusual share of its gun's length; each a figure to verify, not one shown wrong, `cartridges` for the cartridge checks: energy against bullet and velocity, pressure in MPa against psi, dimensions no case can have, a bullet against the calibre its name states, a cartridge older than its parent, and each load against its cartridge, `materials` for the materials registry: every material's density quoted from a page that still states it, within the range it declares, and every material value the catalogue uses covered, so the mass checks read sourced densities, `corroboration` for the corroboration checks: firearm figures compared with a second, independent source (Wikidata), `sources` for the source checks: how many records cite their own maker or another authority, and which heavily cited sites the source hierarchy cannot yet name, `manufacturers` for the manufacturer checks: every manufacturer record held against Wikidata for its website, founding year, country and whether it still trades, `links` for the link checks: every manufacturer website and every cited source asked whether it still answers and is still the page cited."
    },
    "env": {
      "type": "string",
      "enum": [
        "production",
        "staging",
        "local"
      ],
      "description": "Which environment was measured: `production`, `staging` or `local`. A staging run is never mixed into production, because a report read as evidence about the wrong environment is worse than no report."
    },
    "specVersion": {
      "type": [
        "string",
        "null"
      ],
      "description": "The version of this document the run was measured against, so a result names the contract it was true of."
    },
    "commitSha": {
      "type": [
        "string",
        "null"
      ],
      "description": "The commit of our repository the run started from, or null where CI did not report one."
    },
    "runUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "The CI run, where it is reachable."
    },
    "ranAt": {
      "type": "string",
      "description": "When the run finished, ISO 8601."
    },
    "durationMs": {
      "type": "integer",
      "description": "Wall-clock time the whole sweep took, in milliseconds."
    },
    "operations": {
      "type": "integer",
      "description": "How many documented operations the run covered."
    },
    "passed": {
      "type": "integer",
      "description": "Operations where every check that ran passed."
    },
    "failed": {
      "type": "integer",
      "description": "Operations where at least one check failed. One endpoint failing three ways is one unhealthy endpoint, not three."
    },
    "skipped": {
      "type": "integer",
      "description": "Operations nothing could be asked about: no key for that gate, a write the suite will not send against a live host, or a fixture it could not resolve. Never folded into `passed`."
    },
    "tiers": {
      "type": "array",
      "description": "The plans the run held a key for. The tier checks can only cover a gate the run could call, so this is what separates \"every gate was proven\" from \"we had one key\".",
      "items": {
        "type": "string"
      }
    },
    "results": {
      "type": "array",
      "description": "One entry per documented operation.",
      "items": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "The operation, as method and path: `get /v1/firearms/{id}`."
          },
          "method": {
            "type": "string",
            "description": "HTTP method, lower case, as the operation key spells it."
          },
          "path": {
            "type": "string",
            "description": "The documented path, with its parameters still in braces."
          },
          "tag": {
            "type": [
              "string",
              "null"
            ],
            "description": "The OpenAPI tag the operation belongs to, which is how the report groups."
          },
          "tier": {
            "type": [
              "string",
              "null"
            ],
            "description": "The plan the document declares for it, which is what the access verdicts are judged against."
          },
          "status": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Production status, one of `in_production`, `discontinued`, `out_of_production`, `in_service`, `limited_production`, `prototype`. Discontinued records are kept deliberately: a rifle built in 2004 wears parts nobody sells today."
          },
          "ms": {
            "type": "integer",
            "description": "How long that operation took, in milliseconds."
          },
          "verdict": {
            "type": "string",
            "enum": [
              "pass",
              "fail",
              "skip"
            ],
            "description": "`pass`, `fail` or `skip` for the operation as a whole."
          },
          "checks": {
            "type": "object",
            "properties": {
              "passed": {
                "type": "integer",
                "description": "Operations where every check that ran passed."
              },
              "failed": {
                "type": "integer",
                "description": "Operations where at least one check failed. One endpoint failing three ways is one unhealthy endpoint, not three."
              },
              "skipped": {
                "type": "integer",
                "description": "Operations nothing could be asked about: no key for that gate, a write the suite will not send against a live host, or a fixture it could not resolve. Never folded into `passed`."
              }
            },
            "description": "How many checks passed, failed and were skipped for this operation."
          },
          "describes": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the operation asks, when its key does not say. A fitment scenario states its question and the checks behind it; an API operation carries none, its path being its name."
          },
          "failures": {
            "type": "array",
            "description": "Only the checks that failed. A run is about 1,500 checks, and the passing ones are the counts above.",
            "items": {
              "type": "object",
              "properties": {
                "check": {
                  "type": "string",
                  "description": "Which check this entry is about, e.g. `schema`, `tier-refuses`."
                },
                "detail": {
                  "type": "string",
                  "description": "What the check found, in the words a person needs to act on it."
                }
              }
            }
          },
          "access": {
            "type": "array",
            "description": "What happened when the plan gates were exercised: a keyless call, the documented plan, and the plan immediately below it.",
            "items": {
              "type": "object",
              "properties": {
                "check": {
                  "type": "string",
                  "enum": [
                    "gate",
                    "tier-admits",
                    "tier-refuses",
                    "tier-shape"
                  ],
                  "description": "Which check this entry is about, e.g. `schema`, `tier-refuses`."
                },
                "tier": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The plan the document declares for it, which is what the access verdicts are judged against."
                },
                "verdict": {
                  "type": "string",
                  "enum": [
                    "pass",
                    "fail",
                    "skip"
                  ],
                  "description": "`pass`, `fail` or `skip` for the operation as a whole."
                },
                "detail": {
                  "type": "string",
                  "description": "What the check found, in the words a person needs to act on it."
                }
              }
            }
          }
        },
        "required": [
          "key",
          "method",
          "path",
          "verdict",
          "checks",
          "failures",
          "access"
        ]
      }
    },
    "systemChecks": {
      "type": "array",
      "description": "The same run reduced to questions about the API as a whole rather than about one endpoint: whether any response carries JSON inside a string, whether every gate still refuses a keyless call, whether every ETag revalidates. A rollup of the results above, so the two cannot disagree; `found` counts the operations that failed the check and `sample` names a few of them.",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The system check, as a stable kebab-case id: `json-not-stringified`, `allowance-matches-the-plan`. Never renamed, because the docs name it in prose and a reader may have linked to it."
          },
          "describes": {
            "type": "string",
            "description": "What passing means, in a sentence."
          },
          "status": {
            "type": "string",
            "enum": [
              "pass",
              "fail",
              "skip"
            ],
            "description": "`skip` where the run never gathered the evidence, which is not the same as passing."
          },
          "found": {
            "type": "integer",
            "description": "How many operations failed the check."
          },
          "checked": {
            "type": "integer",
            "description": "How many the run could ask it of. A pass over two operations and a pass over 127 both report zero failures, so this is what separates them."
          },
          "sample": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A few of the operations that failed it."
          }
        },
        "required": [
          "id",
          "describes",
          "status",
          "found",
          "checked",
          "sample"
        ]
      }
    }
  },
  "required": [
    "env",
    "ranAt",
    "operations",
    "passed",
    "failed",
    "skipped",
    "tiers",
    "results",
    "systemChecks"
  ]
}

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/gunspec-io-api-contract-run"
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.