GunSpec

Firearms

Browse, search, compare, and retrieve detailed specifications for over 9,000+ firearms including variants.

Auth RequiredBuilder+

Returns the full specification for a single firearm, including its manufacturer, category, calibers, images, and known users.

GET/v1/firearms/{id}

  • stringheaderrequired

    Your API key. Authorization: Bearer <key> is accepted in its place.

  • stringrequired

    Resource slug ID

    Accepts
    a lowercase slug: letters, digits and hyphens
    Example

  • FirearmDetail

    A firearm as stored: every specification column we serve, with no nested relations. FirearmDetail is this plus them, and /v1/firearms/{id}/family-tree returns this shape for current, since the walk reads the row and does not load the relations.

  • integer

    Integer flag, 1 when a 3D model is on file. Stored as the database holds it rather than as a boolean.

  • string | null

    Line-art silhouette, or null where none has been drawn.

  • string | null

    GLB model, or null where none is on file.

  • string | null

    The ammunition load ballistics figures are quoted against, where one is nominated.

  • number | null

    Muzzle velocity in metres per second exactly as the source stated it, kept beside our own figure so a reader can see what was quoted and what was derived.

  • number | null

    Muzzle energy in joules exactly as the source stated it.

  • number | null

    Effective range in metres exactly as the source stated it.

  • number | null

    Maximum range in metres exactly as the source stated it.

  • string | null

    Where the ballistics figures came from, named in prose.

  • string | null

    URL of the ballistics source, where it is a page rather than a book.

  • string

    URL-safe slug identifying the firearm, e.g. glock-17-gen5. Stable: it is what a mirror keys on.

  • string

    Display name, as the maker writes it.

  • string

    Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.

  • string

    Slug of the category it belongs to. Resolve against /v1/categories.

  • string | null

    The firearm this one is a variant of, or null when it is not a variant. Variant relationships are what firearm.variant.updated webhooks and /v1/firearms/{id}/variants follow.

  • string | null

    How this record differs from its parent: optics_ready, compact, threaded and so on. Null when the record has no parent.

  • integer | null

    Year it entered production or service. Null where the date is disputed or unknown.

  • integer | null

    Year production ended, or null while it is still made.

  • FirearmStatus | null

    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.

  • string | null

    ISO 3166-1 alpha-2 code of where it was designed, e.g. AT.

  • number | null

    Unloaded weight in grams, without magazine.

  • number | null

    Loaded weight in grams, with a full magazine.

  • number | null

    Overall length in millimetres, stock extended where it folds or collapses.

  • number | null

    Barrel length in millimetres, measured from the breech face.

  • number | null

    Height in millimetres, including sights and a fitted magazine.

  • number | null

    Width in millimetres at the widest point.

  • number | null

    Distance between front and rear iron sights in millimetres. Null on a record with no iron sights.

  • string | null

    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.

  • string | null

    What releases the striker or hammer: striker_fired, hammer_fired.

  • string | null

    Trigger arrangement: single_action, double_action, safe_action.

  • number | null

    Trigger pull weight in newtons. Divide by 4.448 for pounds-force.

  • integer | null

    Rounds in the standard magazine. Null where the firearm is not magazine-fed.

  • string | null

    Magazine pattern: detachable_box, internal, drum, belt.

  • number | null

    Muzzle velocity in metres per second, for the default load.

  • number | null

    Muzzle energy in joules, for the default load.

  • number | null

    Effective range in metres against a point target.

  • number | null

    Maximum range in metres. Where the projectile lands, not where it is useful.

  • integer | null

    Cyclic rate in rounds per minute. Null on anything that is not automatic.

  • string | null

    Rifling description, e.g. 6 grooves, right-hand twist.

  • number | null

    Rifling twist rate in millimetres per turn. Divide by 25.4 for inches.

  • integer | null

    Number of grooves cut in the bore.

  • string | null

    What the frame or receiver is made of.

  • string | null

    What the slide is made of. Null on anything without one.

  • string | null

    What the barrel is made of.

  • string | null

    What the stock or furniture is made of.

  • string | null

    Surface finish, e.g. nitride, parkerized, cerakote.

  • string | null

    JSON array of safety mechanisms

  • string | null

    JSON array of features

  • string | null

    JSON array of feed systems

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure. These are balance numbers for game use and are not derived from the ballistics above.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • integer | null

    Editorial game statistic, 0-100. Not a measured figure.

  • string | null

    Prose summary of the record, where one has been written.

  • string | null

    Free-text notes that do not belong in a specific field.

  • string | null

    Person or team credited with the design, where it is known.

  • number | null

    Length with stock folded (mm)

  • string | null

    JSON array of alternate names/designations

  • string | null

    JSON array of firing modes

  • string | null

    JSON array of conflict objects with name, years, and sides

  • string | null

    JSON object with estimated_total, production_years, and notes

  • string | null

    Historical trivia / game-dev flavor text

  • string | null

    JSON array of source URLs the record was compiled from. Check a specific figure against these rather than against dataConfidence.

  • number | null

    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.

  • string

    When the record was first added, YYYY-MM-DD HH:MM:SS in UTC.

  • 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.

  • string | null

    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

    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.

  • string[]

    The pages consulted when the record was compiled, as an array. Check a specific figure against these rather than against dataConfidence.

  • object[]

    What each cited page is, in sources order, on the SourceKind hierarchy. A host not in the source map is other, never guessed.

  • SourceKind | null

    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.

  • number | null

    The 0 to 1 score set from what was actually sourced, never raised by hand. See the confidence bands in the docs.

  • string | null

    When a source was last read against this record. Null means the row is still seed knowledge.

  • string[]

    Which fields the source stated, as an array. Everything else on a verified row is still unverified. Null where no source has been read.

  • string | null

    Cartridges only: the page the drawing figures were taken from. Null on every other kind of record.

  • string

    When a served column last changed; the same value the record carries at the top level.

  • string | null

    The record's content version, equal to the top-level version; equal versions mean equal data.

  • Manufacturer | null

    Null when the record names a manufacturer id the catalog no longer holds.

  • Category | null

    Null when the record names a category id the catalog no longer holds.

  • FirearmCaliber[]

    Every cartridge this firearm is chambered for, primary first.

  • string

    Slug of the cartridge. Resolve against /v1/calibers/{id}.

  • integer

    Integer flag, 1 on the chambering the firearm is normally sold in. A firearm may be chambered for several cartridges but has at most one primary.

  • string

    Display name, as the maker writes it.

  • string | null

    NATO designation where the cartridge has one, e.g. 9mm NATO. Null otherwise.

  • number | null

    Bullet diameter in millimetres.

  • number | null

    Case length in millimetres.

  • string | null

    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.

  • number | null

    Case neck outside diameter in millimetres.

  • number | null

    Bottleneck cases only.

  • number | null

    Case base diameter in millimetres, ahead of the extractor groove.

  • number | null

    Rim diameter in millimetres.

  • number | null

    Rim thickness in millimetres.

  • FirearmImage[]

    Every image on file, silhouette first. Each carries an absolute, directly fetchable url.

  • integer

    Autoincrementing image id. Numeric, unlike the catalog slugs.

  • string

    Slug of the firearm this row belongs to.

  • string

    Absolute, directly fetchable URL.

  • ImageType | null

    Role of the image: primary, gallery, thumbnail, svg, render.

  • string | null

    Where the record came from: a curated entry, an inference, or an import.

  • string | null

    Licence the asset is held under, where one is recorded.

  • MediaKind | null

    What the asset is: silhouette, render, photo, schematic, model. /v1/firearms/{id}/media/{selector} addresses an asset by this.

  • string | null

    Where the bytes live: cdn for a static path, r2 for an upload we serve.

  • string | null

    Who made the asset, where it is credited.

  • string | null

    Page the asset or document was taken from.

  • string | null

    Alt text, where one has been written. Null otherwise, so do not render an empty string.

  • integer | null

    Pixel width, where it is known.

  • FirearmUser[]

    Forces and agencies that have adopted it.

  • integer

    Autoincrementing row id.

  • string

    Slug of the firearm this row belongs to.

  • string

    The force, agency or organisation that adopted it.

  • string | null

    What kind of user: military, police, civilian.

  • string | null

    ISO 3166-1 alpha-2 code of the user's country.

  • integer | null

    Year of adoption, where it is known.

  • string | null

    What that user calls it, where it differs from the maker's name.

  • FirearmSchematic[]

    Exploded-view and parts diagrams on file, empty where none have been sourced.

  • integer

    Autoincrementing schematic id.

  • string

    Slug of the firearm this row belongs to.

  • string

    What the document is called.

  • SchematicType

    What a schematic document is.

  • string

    Absolute, directly fetchable URL.

  • string | null

    File format, e.g. pdf.

  • string | null

    Revision of the document, where the publisher versions it.

  • string | null

    Publisher of the document, often but not always the maker.

  • string | null

    Where the document came from.

  • string | null

    Page the asset or document was taken from.

  • string | null

    Who made the asset, where it is credited.

  • string | null

    Licence the asset is held under, where one is recorded.

  • 400VALIDATION_ERRORValidation error
  • 401UNAUTHORIZEDAPI key required
  • 403FORBIDDENValid key, not permitted
  • 404NOT_FOUNDResource not found
  • 429RATE_LIMITEDRate limit exceeded
  • 500INTERNAL_ERRORUnexpected server error

Requires an API key with Builder tier or higher.

alternateNames, firingModes, conflicts, and productionNumbers are JSON-encoded strings. Parse them client-side.

conflicts contains objects with name, years, and sides (array of belligerent strings).

productionNumbers contains estimated_total (number), production_years (string), and notes (string).

The schematics array (blueprints, spec sheets) is included only for Studio tier or higher; it is omitted otherwise. See the Schematics endpoint for the full document shape.

Minimum tier
Builder+
Monthly quota
25,000/mo
Rate limit
60/min
Daily cap
2,000

Figures shown are for this endpoint's minimum tier. Higher tiers raise every limit.

This read answers conditional requests. Keep the ETag from a response and send it back as If-None-Match: an unchanged record returns 304 Not Modified with no body, which counts toward your per-minute rate limit but not your daily allowance.