Properties
| Name | Type | Description |
|---|---|---|
| id | string | URL-safe slug identifying the cartridge, e.g. `9x19mm-parabellum`. |
| name | string | Display name, as the maker writes it. |
| aliases | arraynull | Other names this cartridge is sold or written as. |
| natoDesignation | stringnull | NATO designation where the cartridge has one, e.g. `9mm NATO`. Null otherwise. |
| bulletDiameterMm | numbernull | Bullet diameter in millimetres. |
| neckDiameterMm | numbernull | Case neck outside diameter in millimetres. |
| shoulderDiameterMm | numbernull | Bottleneck cases only. |
| baseDiameterMm | numbernull | Case base diameter in millimetres, ahead of the extractor groove. |
| rimDiameterMm | numbernull | Rim diameter in millimetres. |
| rimThicknessMm | numbernull | Rim thickness in millimetres. |
| caseLengthMm | numbernull | Case length in millimetres. |
| overallLengthMm | numbernull | Overall length in millimetres, stock extended where it folds or collapses. |
| bulletLengthMm | numbernull | Typical projectile length. |
| maxPressureMpa | numbernull | Maximum average pressure in megapascals, as the standards body specifies it. |
| maxPressurePsi | numbernull | The same pressure in pounds per square inch, converted. |
| typicalBulletWeightG | numbernull | Representative bullet weight in grams. Divide by 0.0648 for grains. |
| typicalMuzzleVelocityMps | numbernull | Representative muzzle velocity in metres per second. |
| typicalMuzzleEnergyJ | numbernull | Representative muzzle energy in joules. |
| primerType | stringnull | Primer size and type, e.g. `small_pistol`, `large_rifle`, `rimfire`. |
| cartridgeType | stringnull | Head type: `rimmed`, `rimless`, `semi_rimmed`, `rebated_rim`, `belted`, plus historical values like `cap_and_ball`. **Not the broad class.** The registry said `pistol`/`rifle`/`shotgun` until the colu |
| caseShape | stringnull | Case profile: `straight`, `bottleneck`, `tapered`, `belted`. |
| caseMaterial | stringnull | What the case is made of: `brass`, `steel`, `aluminium`, `polymer`. |
| projectileKind | stringnull | `none` is a blank. |
| bulletProfile | stringnull | Bullet shape: `fmj`, `hollow_point`, `soft_point`, `spitzer`, `round_nose`. |
| closure | stringnull | What seals the case mouth; a blank is a star crimp. |
| markingColor | stringnull | Paint that identifies the load: crimp lacquer on a blank, tip colour on a military round. |
| markingMeaning | stringnull | What that colour signifies, where the marking is a standard one. |
| parentCartridgeId | stringnull | The cartridge this one was derived from, or null. A wildcat and its parent case, for example. |
| yearIntroduced | integernull | Year it entered production or service. Null where the date is disputed or unknown. |
| designer | stringnull | Person or team credited with the design, where it is known. |
| specSource | stringnull | Page the dimensions were read from. |
| specStandard | stringnull | The standards body whose figures these are (`SAAMI`, `CIP`), where the source names one. |
| dataConfidence | numbernull | How completely the record is specified and how well it is sourced, 0 to 1. A record-level completeness and provenance measure, **not** a per-field probability of correctness. Use it to rank and triage |
| verifiedAt | stringnull | When a person last checked this record against its source. Null means nobody has: the row is model knowledge until then. |
| verifiedFields | arraynull | The fields the source stated. The same list is in `provenance.verifiedFields`. |
| createdAt | string | When the record was first added, `YYYY-MM-DD HH:MM:SS` in UTC. |
| 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 |
| provenance | object |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/gunspec-io/json-schema/gunspec-io-caliber-schema.json",
"title": "Caliber",
"x-generated": "2026-10-30",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/gunspec-io-openapi.json#/components/schemas/Caliber",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "URL-safe slug identifying the cartridge, e.g. `9x19mm-parabellum`."
},
"name": {
"type": "string",
"description": "Display name, as the maker writes it."
},
"aliases": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Other names this cartridge is sold or written as."
},
"natoDesignation": {
"type": [
"string",
"null"
],
"description": "NATO designation where the cartridge has one, e.g. `9mm NATO`. Null otherwise."
},
"bulletDiameterMm": {
"type": [
"number",
"null"
],
"description": "Bullet diameter in millimetres."
},
"neckDiameterMm": {
"type": [
"number",
"null"
],
"description": "Case neck outside diameter in millimetres."
},
"shoulderDiameterMm": {
"type": [
"number",
"null"
],
"description": "Bottleneck cases only."
},
"baseDiameterMm": {
"type": [
"number",
"null"
],
"description": "Case base diameter in millimetres, ahead of the extractor groove."
},
"rimDiameterMm": {
"type": [
"number",
"null"
],
"description": "Rim diameter in millimetres."
},
"rimThicknessMm": {
"type": [
"number",
"null"
],
"description": "Rim thickness in millimetres."
},
"caseLengthMm": {
"type": [
"number",
"null"
],
"description": "Case length in millimetres."
},
"overallLengthMm": {
"type": [
"number",
"null"
],
"description": "Overall length in millimetres, stock extended where it folds or collapses."
},
"bulletLengthMm": {
"type": [
"number",
"null"
],
"description": "Typical projectile length."
},
"maxPressureMpa": {
"type": [
"number",
"null"
],
"description": "Maximum average pressure in megapascals, as the standards body specifies it."
},
"maxPressurePsi": {
"type": [
"number",
"null"
],
"description": "The same pressure in pounds per square inch, converted."
},
"typicalBulletWeightG": {
"type": [
"number",
"null"
],
"description": "Representative bullet weight in grams. Divide by 0.0648 for grains."
},
"typicalMuzzleVelocityMps": {
"type": [
"number",
"null"
],
"description": "Representative muzzle velocity in metres per second."
},
"typicalMuzzleEnergyJ": {
"type": [
"number",
"null"
],
"description": "Representative muzzle energy in joules."
},
"primerType": {
"type": [
"string",
"null"
],
"description": "Primer size and type, e.g. `small_pistol`, `large_rifle`, `rimfire`."
},
"cartridgeType": {
"type": [
"string",
"null"
],
"description": "Head type: `rimmed`, `rimless`, `semi_rimmed`, `rebated_rim`, `belted`, plus historical values like `cap_and_ball`. **Not the broad class.** The registry said `pistol`/`rifle`/`shotgun` until the column was read, and it holds neither."
},
"caseShape": {
"type": [
"string",
"null"
],
"enum": [
"straight",
"tapered",
"bottleneck",
"none",
null
],
"description": "Case profile: `straight`, `bottleneck`, `tapered`, `belted`."
},
"caseMaterial": {
"type": [
"string",
"null"
],
"enum": [
"brass",
"nickel_brass",
"steel",
"lacquered_steel",
"aluminium",
"polymer",
"paper",
"caseless",
"none",
null
],
"description": "What the case is made of: `brass`, `steel`, `aluminium`, `polymer`."
},
"projectileKind": {
"type": [
"string",
"null"
],
"enum": [
"bullet",
"none",
"shot",
"slug",
"round_ball",
"flechette",
"dart",
"pellet",
"rocket",
"grenade",
"signal",
null
],
"description": "`none` is a blank."
},
"bulletProfile": {
"type": [
"string",
"null"
],
"enum": [
"spitzer",
"spitzer_boat_tail",
"round_nose",
"flat_nose",
"wadcutter",
"semi_wadcutter",
"hollow_point",
"truncated_cone",
"round_ball",
null
],
"description": "Bullet shape: `fmj`, `hollow_point`, `soft_point`, `spitzer`, `round_nose`."
},
"closure": {
"type": [
"string",
"null"
],
"enum": [
"bullet",
"star_crimp",
"rosette_crimp",
"roll_crimp",
"fold_crimp",
"wad",
"paper",
"none",
null
],
"description": "What seals the case mouth; a blank is a star crimp."
},
"markingColor": {
"type": [
"string",
"null"
],
"enum": [
"black",
"white",
"red",
"orange",
"yellow",
"green",
"blue",
"purple",
"pink",
"brown",
"grey",
"silver",
"gold",
null
],
"description": "Paint that identifies the load: crimp lacquer on a blank, tip colour on a military round."
},
"markingMeaning": {
"type": [
"string",
"null"
],
"description": "What that colour signifies, where the marking is a standard one."
},
"parentCartridgeId": {
"type": [
"string",
"null"
],
"description": "The cartridge this one was derived from, or null. A wildcat and its parent case, for example."
},
"yearIntroduced": {
"type": [
"integer",
"null"
],
"description": "Year it entered production or service. Null where the date is disputed or unknown."
},
"designer": {
"type": [
"string",
"null"
],
"description": "Person or team credited with the design, where it is known."
},
"specSource": {
"type": [
"string",
"null"
],
"description": "Page the dimensions were read from."
},
"specStandard": {
"type": [
"string",
"null"
],
"enum": [
"saami",
"cip",
"nato",
"proprietary",
"none",
null
],
"description": "The standards body whose figures these are (`SAAMI`, `CIP`), where the source names one."
},
"dataConfidence": {
"type": [
"number",
"null"
],
"description": "How completely the record is specified and how well it is sourced, 0 to 1. A record-level completeness and provenance measure, **not** a per-field probability of correctness. Use it to rank and triage; use `sources` to verify an individual number."
},
"verifiedAt": {
"type": [
"string",
"null"
],
"description": "When a person last checked this record against its source. Null means nobody has: the row is model knowledge until then."
},
"verifiedFields": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "The fields the source stated. The same list is in `provenance.verifiedFields`."
},
"createdAt": {
"type": "string",
"description": "When the record was first added, `YYYY-MM-DD HH:MM:SS` in UTC."
},
"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."
},
"provenance": {
"$ref": "#/$defs/Provenance"
}
},
"$defs": {
"Provenance": {
"type": "object",
"description": "Where a record's figures came from and how far they have been checked, in one place. `sources` are the pages consulted; check a specific figure against those. `sourceKinds` says what each page is and `bestSourceKind` the strongest of them, on the hierarchy `SourceKind` defines: a maker or standards-body page is evidence for a figure, a retailer or forum page is evidence the item exists. `dataConfidence` is the 0 to 1 score set from what was actually sourced and never raised by hand. `verifiedAt` and `verifiedFields` say when a source was last read against the record and which fields it stated; null means the row is still seed knowledge. `updatedAt` and `version` are the same cache signals the record carries at the top level.",
"properties": {
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "The pages consulted when the record was compiled, as an array. Check a specific figure against these rather than against `dataConfidence`."
},
"sourceKinds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Absolute, directly fetchable URL."
},
"kind": {
"$ref": "#/$defs/SourceKind"
},
"archivedFrom": {
"type": [
"string",
"null"
],
"description": "The original address when `url` is a Wayback Machine capture of it. A cited page that no longer answers is replaced by its last capture that answered 200, so the citation still shows what its author read; `kind` is the original page's."
},
"rank": {
"type": "integer",
"description": "The kind's place in the source hierarchy: 0 is the maker, the strongest; higher is weaker."
},
"tier": {
"type": "string",
"enum": [
"authority",
"classified",
"unclassified"
],
"description": "Where the site stands in the source registry (`/v1/data/sources`): an authority (the maker, a standards body, a government), a classified site, or one not yet classed."
},
"basis": {
"type": "string",
"enum": [
"declared",
"maker",
"rule",
"unclassified"
],
"description": "What the class rests on: classed by a person, a catalogued maker's own site, a .gov or .mil domain, or nothing yet."
},
"evidence": {
"type": [
"string",
"null"
],
"description": "The words the site was classed on, where a person recorded them."
}
},
"required": [
"url",
"kind",
"archivedFrom",
"rank",
"tier",
"basis",
"evidence"
]
},
"description": "What each cited page is, in `sources` order, on the `SourceKind` hierarchy. A host not in the source map is `other`, never guessed."
},
"bestSourceKind": {
"anyOf": [
{
"$ref": "#/$defs/SourceKind"
},
{
"type": "null"
}
],
"description": "The strongest kind among the citations, or null when nothing is cited. `manufacturer` or `standards_body` means a figure can be checked against an authority; `retailer` or `community` alone means the record is still supported by copies of copies."
},
"makerSource": {
"type": [
"string",
"null"
],
"description": "The first cited page on the record's own manufacturer's website, or null when it cites none. A page on another maker's site does not count. Cited from the maker is not the same as checked against it: `verifiedFields` names the figures that were read against a source."
},
"evidence": {
"type": "string",
"enum": [
"verified",
"maker",
"authority",
"secondary",
"none"
],
"description": "How far the record's figures are backed, strongest first, for a badge: `verified` when at least one figure was read against a source (`verifiedFields`), `maker` when it cites a page on its own manufacturer's site (`makerSource`), `authority` when it cites a maker, standards body or government page, `secondary` when it cites only press, retailers, references or forums, `none` when it cites nothing. Derived from the fields beside it."
},
"checks": {
"type": "object",
"description": "The checks the record has been through, on a single record's response only: every task the data agent (Redback) or a person was given about it, what each proposed, the pages it read, and whether a person accepted it. Nothing an agent proposes reaches the record until a person accepts it, so this is the trail behind `verifiedFields`. Who reviewed is not published; an agent's instance name is.",
"properties": {
"raised": {
"type": "integer",
"description": "Every task ever raised on the record, answered or not."
},
"open": {
"type": "integer",
"description": "Tasks still waiting to be worked."
},
"history": {
"type": "array",
"description": "The latest twenty, newest first.",
"items": {
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "The task id, stable across runs; the same id `/v1/data/tasks/{taskKey}` answers for."
},
"number": {
"type": [
"integer",
"null"
],
"description": "The task's number; `/v1/data/tasks/{number}` loads it as its key does."
},
"check": {
"type": [
"string",
"null"
],
"description": "The check that raised it, where one did."
},
"kind": {
"type": "string",
"description": "`verify` reads the record against its maker's page, `gap` researches an empty field, `contradiction` judges fields that disagree, `vocabulary` a value outside a list."
},
"agent": {
"type": [
"string",
"null"
],
"description": "`redback` when the agent worked it, `staff` when a person did, null when nobody has."
},
"worker": {
"type": [
"string",
"null"
],
"description": "The agent instance that worked it; null for a person."
},
"status": {
"type": "string",
"description": "`resolved` (a proposal was filed), `unverifiable` (nothing could be established; retried after a cooldown), `not_a_fault`, or open."
},
"decidedAt": {
"type": [
"string",
"null"
],
"description": "When the task was answered; null while it is open."
},
"proposed": {
"type": [
"string",
"null"
],
"description": "What it proposed, in its own words; null while it is open."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Per-field completeness, keyed by column name."
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "The pages it read and quoted."
},
"review": {
"type": [
"object",
"null"
],
"properties": {
"decision": {
"type": "string",
"enum": [
"accepted",
"rejected"
],
"description": "Whether a person accepted the proposal."
},
"at": {
"type": [
"string",
"null"
],
"description": "When they decided."
}
},
"description": "A person's decision on the proposal; null until reviewed."
},
"finding": {
"type": [
"object",
"null"
],
"description": "What the check found, where a check raised the task: its own line for this record and the figures it measured, so a reader sees how the value breaks the method. The same the public task board serves with `include=research`.",
"properties": {
"why": {
"type": [
"string",
"null"
],
"description": "The check's line for this record."
},
"evidence": {
"type": [
"object",
"null"
],
"additionalProperties": true,
"description": "The figures the check measured."
}
},
"required": [
"why",
"evidence"
]
}
},
"required": [
"task",
"number",
"check",
"kind",
"agent",
"worker",
"status",
"decidedAt",
"proposed",
"fields",
"sources",
"review",
"finding"
]
}
}
},
"required": [
"raised",
"open",
"history"
]
},
"dataConfidence": {
"type": [
"number",
"null"
],
"description": "The 0 to 1 score set from what was actually sourced, never raised by hand. See the confidence bands in the docs."
},
"verifiedAt": {
"type": [
"string",
"null"
],
"description": "When a source was last read against this record. Null means the row is still seed knowledge."
},
"verifiedFields": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Which fields the source stated, as an array. Everything else on a verified row is still unverified. Null where no source has been read."
},
"specSource": {
"type": [
"string",
"null"
],
"description": "Cartridges only: the page the drawing figures were taken from. Null on every other kind of record."
},
"updatedAt": {
"type": "string",
"description": "When a served column last changed; the same value the record carries at the top level."
},
"version": {
"type": [
"string",
"null"
],
"description": "The record's content version, equal to the top-level `version`; equal versions mean equal data."
}
},
"required": [
"sources",
"sourceKinds",
"bestSourceKind",
"makerSource",
"evidence",
"dataConfidence",
"verifiedAt",
"verifiedFields",
"specSource",
"updatedAt",
"version"
]
},
"SourceKind": {
"type": "string",
"enum": [
"manufacturer",
"standards_body",
"government",
"peer_reviewed",
"reference",
"aggregator",
"press",
"retailer",
"community",
"other"
],
"description": "What kind of page a cited source is, strongest first: the maker's own page, a standards body (SAAMI, C.I.P.), a government or military document, an independent reference work, a specification aggregator, the press, a retailer or auction listing, a community site, or an unclassified page. Weigh a figure by the best kind behind it, never by how many pages were cited."
}
}
}
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.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/gunspec-io-caliber"
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.