GunSpec

Firearms

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

Auth RequiredExplorer+

Returns a paginated list of firearms with optional filters. Filters combine with AND; features takes comma-separated slugs that must all match.

GET/v1/firearms

  • stringheaderrequired

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

  • integerdefault1

    Page number, from 1 to 10,000

    Range
    1 – 10000
    Example
  • integerdefault20

    Items per page (max 100)

    Range
    1 – 100
    Example
  • stringdefaultname

    Sort field

    Accepts
    Example
  • stringdefaultasc

    Sort order

    Accepts
    Example
  • string

    Comma-separated list of fields to include

    Example
  • string

    Filter by manufacturer slug

    Max length
    100
    Example
  • string

    Filter by caliber slug

    Example
  • string

    Filter by category slug

    Max length
    100
    Example
  • string

    Filter by action type, as stored and underscored. The vocabulary is /v1/firearms/action-types

    Example
  • string

    Filter by ISO 3166-1 alpha-2 country code

    Example
  • integer

    Minimum year introduced

  • integer

    Maximum year introduced

  • number

    Minimum empty weight (grams)

  • number

    Maximum empty weight (grams)

  • number

    Minimum barrel length (mm)

  • string

    Filter by production status

    Accepts
  • string

    Comma-separated feature slugs; all must match

    Example
  • string

    Only firearms with (or without) a 3D model

    Accepts
  • string

    Only firearms with (or without) real imagery: a render or a photograph, ignoring the line-art silhouette every firearm has

    Accepts
  • string

    Only records added after this ISO 8601 timestamp

  • string

    Only records added before this ISO 8601 timestamp

  • FirearmListItem[]

    One page of results

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

  • integer | null

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

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

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

  • number | null

    Unloaded weight in grams, without magazine.

  • number | null

    Barrel length in millimetres, measured from the breech face.

  • InlineMediaItem[]

    Every image this firearm has, silhouette first. Empty when none are on file.

  • integer

    Autoincrementing image id.

  • string

    Absolute, directly fetchable URL.

  • MediaKind

    What kind of asset a media row is.

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

  • integer | null

    Pixel height, where it is known.

  • string

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

  • string | null

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

  • string | null

    GLB model, or null where none is on file.

  • integer

    How many accounts have favorited this record.

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

  • number

    Current page number

  • number

    Items per page

  • number

    Total matching records (Builder and above)

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

Minimum tier
Explorer+
Monthly quota
200/mo
Rate limit
10/min
Daily cap
50

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.