gunspec-io · Schema

FirearmListItem

FirearmsAPIDatabaseSpecificationsSDKMCP

Properties

Name Type Description
id string URL-safe slug identifying the firearm, e.g. `glock-g17-gen5`. Stable: it is what a mirror keys on.
name string Display name, as the maker writes it.
manufacturerId string Slug of the manufacturer that makes it. Resolve against `/v1/manufacturers/{id}`.
categoryId string Slug of the category it belongs to. Resolve against `/v1/categories`.
yearIntroduced integernull Year it entered production or service. Null where the date is disputed or unknown.
status object 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
countryOfOrigin stringnull ISO 3166-1 alpha-2 code of where it was designed, e.g. `AT`.
actionType stringnull How the action cycles: `short_recoil`, `gas_operated`, `blowback`, `bolt_action` and so on. An open vocabulary: the values in use are published on the schema as `x-gunspec-vocabulary`, and `GET /v1/fi
weightEmptyG numbernull Unloaded weight in grams, without magazine.
barrelLengthMm numbernull Barrel length in millimetres, measured from the breech face.
images array Every image this firearm has, silhouette first. Empty when none are on file.
createdAt string When the record was first added, `YYYY-MM-DD HH:MM:SS` in UTC.
svgLineArtUrl stringnull Line-art silhouette, or null where none has been drawn.
model3dUrl stringnull GLB model, or null where none is on file.
favoriteCount integer How many accounts have favorited this record.
updatedAt string When a field we serve last changed. Maintained by the database rather than by whatever wrote the row, so it moves for a corrected specification and does not move for a re-run of the importer.
version stringnull Opaque fingerprint of this record. It changes when and only when a field we serve changes, so a client holding the same value already has the record and need not fetch it. Equality is the only support
View JSON Schema on GitHub

JSON Schema

gunspec-io-firearm-list-item-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/gunspec-io/json-schema/gunspec-io-firearm-list-item-schema.json",
  "title": "FirearmListItem",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/gunspec-io-openapi.json#/components/schemas/FirearmListItem",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "URL-safe slug identifying the firearm, e.g. `glock-g17-gen5`. Stable: it is what a mirror keys on."
    },
    "name": {
      "type": "string",
      "description": "Display name, as the maker writes it."
    },
    "manufacturerId": {
      "type": "string",
      "description": "Slug of the manufacturer that makes it. Resolve against `/v1/manufacturers/{id}`."
    },
    "categoryId": {
      "type": "string",
      "description": "Slug of the category it belongs to. Resolve against `/v1/categories`."
    },
    "yearIntroduced": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Year it entered production or service. Null where the date is disputed or unknown."
    },
    "status": {
      "anyOf": [
        {
          "$ref": "#/$defs/FirearmStatus"
        },
        {
          "type": "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."
    },
    "countryOfOrigin": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 3166-1 alpha-2 code of where it was designed, e.g. `AT`."
    },
    "actionType": {
      "type": [
        "string",
        "null"
      ],
      "x-gunspec-vocabulary": [
        "short_recoil",
        "bolt_action",
        "blowback",
        "break_action",
        "gas_operated",
        "gas_operated_long_stroke",
        "gas_operated_direct_impingement",
        "revolving",
        "gas_operated_short_stroke",
        "muzzleloader",
        "pump_action",
        "lever_action",
        "double_action",
        "falling_block",
        "roller_delayed_blowback",
        "single_action",
        "gas_operated_short_stroke_piston",
        "single_action_revolver",
        "double_action_revolver",
        "inertia_operated",
        "recoil_operated",
        "delayed_blowback",
        "long_recoil",
        "gas_operated_rotating_bolt",
        "breech_loading",
        "rolling_block",
        "straight_pull",
        "trapdoor",
        "spring_piston",
        "hinged_breechblock",
        "lever_delayed_blowback",
        "blow_forward",
        "electric_gatling",
        "double_action_only",
        "rotating_barrel",
        "pneumatic",
        "gas_operated_dual_mode",
        "delayed_blowback_rotating_barrel",
        "gas_delayed_blowback",
        "radial_delayed_blowback",
        "short_recoil_rotating_barrel",
        "gas_operated_balanced_automatics",
        "gas_operated_balanced_recoil",
        "gas_operated_blow_forward",
        "gas_operated_open_bolt",
        "gas_operated_tilting_bolt"
      ],
      "description": "How the action cycles: `short_recoil`, `gas_operated`, `blowback`, `bolt_action` and so on. An open vocabulary: the values in use are published on the schema as `x-gunspec-vocabulary`, and `GET /v1/firearms/action-types` is the live list."
    },
    "weightEmptyG": {
      "type": [
        "number",
        "null"
      ],
      "description": "Unloaded weight in grams, without magazine."
    },
    "barrelLengthMm": {
      "type": [
        "number",
        "null"
      ],
      "description": "Barrel length in millimetres, measured from the breech face."
    },
    "images": {
      "type": "array",
      "description": "Every image this firearm has, silhouette first. Empty when none are on file.",
      "items": {
        "$ref": "#/$defs/InlineMediaItem"
      }
    },
    "createdAt": {
      "type": "string",
      "description": "When the record was first added, `YYYY-MM-DD HH:MM:SS` in UTC."
    },
    "svgLineArtUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "Line-art silhouette, or null where none has been drawn."
    },
    "model3dUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "GLB model, or null where none is on file."
    },
    "favoriteCount": {
      "type": "integer",
      "description": "How many accounts have favorited this record."
    },
    "updatedAt": {
      "type": "string",
      "description": "When a field we serve last changed. Maintained by the database rather than by whatever wrote the row, so it moves for a corrected specification and does not move for a re-run of the importer."
    },
    "version": {
      "type": [
        "string",
        "null"
      ],
      "description": "Opaque fingerprint of this record. It changes when and only when a field we serve changes, so a client holding the same value already has the record and need not fetch it. Equality is the only supported operation: do not parse it, and do not assume how it is computed. Null means the record has not been written since versioning began, not that it is unchanged."
    }
  },
  "$defs": {
    "FirearmStatus": {
      "type": "string",
      "enum": [
        "in_production",
        "discontinued",
        "out_of_production",
        "in_service",
        "limited_production",
        "prototype"
      ],
      "description": "Production status of a firearm. Closed: these are every value the catalog holds."
    },
    "InlineMediaItem": {
      "type": "object",
      "description": "One image attached to a firearm, inlined on list-shaped responses so a client can render a gallery without a second request. `url` is absolute and directly fetchable. For the full envelope, including credits, licence, dimensions and data-URI encoding, use `/v1/firearms/{id}/media`.",
      "properties": {
        "id": {
          "type": "integer",
          "description": "Autoincrementing image id."
        },
        "url": {
          "type": "string",
          "description": "Absolute, directly fetchable URL."
        },
        "kind": {
          "$ref": "#/$defs/MediaKind"
        },
        "alt": {
          "type": [
            "string",
            "null"
          ],
          "description": "Alt text, where one has been written. Null otherwise, so do not render an empty string."
        },
        "width": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Pixel width, where it is known."
        },
        "height": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Pixel height, where it is known."
        }
      },
      "required": [
        "id",
        "url",
        "kind"
      ]
    },
    "MediaKind": {
      "type": "string",
      "enum": [
        "silhouette",
        "render",
        "photo",
        "schematic",
        "model"
      ],
      "description": "What kind of asset a media row is."
    }
  }
}

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-firearm-list-item"
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.