Browse, search, compare, and retrieve detailed specifications for over 9,000+ firearms including variants.
Authentifizierung erforderlichExplorer+
List Firearms
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
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
stringstandardname
Sort field
Akzeptiert
Beispiel
stringstandardasc
Sort order
Akzeptiert
Beispiel
string
Comma-separated list of fields to include
Beispiel
string
Filter by manufacturer slug
Max. Länge
100
Beispiel
string
Filter by caliber slug
Beispiel
string
Filter by category slug
Max. Länge
100
Beispiel
string
Filter by action type, as stored and underscored. The vocabulary is /v1/firearms/action-types
Beispiel
string
Filter by ISO 3166-1 alpha-2 country code
Beispiel
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
Akzeptiert
string
Comma-separated feature slugs; all must match
Beispiel
string
Only firearms with (or without) a 3D model
Akzeptiert
string
Only firearms with (or without) real imagery: a render or a photograph, ignoring the line-art silhouette every firearm has
Akzeptiert
string
Only records added after this ISO 8601 timestamp
string
Only records added before this ISO 8601 timestamp
application/json
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.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Search Firearms
Searches firearm names and descriptions using SQLite FTS5. Results are ordered by relevance.
GET/v1/firearms/search
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Search query
Max. Länge
200
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
FirearmSearchResult[]
One search hit. The field names are snake_case here, unlike /v1/firearms and the rest of the catalog: these are the search view's own columns and renaming them would break every consumer already reading them. manufacturer_name and category_name are joined in so a result list renders without a second call.
string
URL-safe slug identifying the firearm. Stable: it is what a mirror keys on.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer. manufacturerId on the camelCase endpoints.
string | null
Slug of the category. categoryId on the camelCase endpoints.
string | null
Display name of the manufacturer, joined in so a result row needs no second call.
string | null
Display name of the category.
string | null
Slug of the category again, under the name the search view uses. Same value as category_id.
integer | null
Year the model was introduced.
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 the country of origin.
string | null
Operating action as stored, underscored, e.g. short_recoil, bolt_action, gas_operated. The full vocabulary is /v1/firearms/action-types; a hyphenated value matches nothing.
number | null
Unloaded weight in grams, without magazine.
number | null
Barrel length in millimetres, measured from the breech face.
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.
number | null
FTS5 relevance score the page is ordered by. Lower is a better match (SQLite bm25 scores are negative), and it is only comparable within one response. Absent or null when the query fell back to a plain substring match, which has no ranking.
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.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Resolve a Name
Turns a name as somebody actually writes it ("G19 gen 5 MOS", "AK-47", "H&K MP5") into a single catalog id, or says why it cannot.
GET/v1/firearms/resolve
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
The name to resolve, up to 200 characters.
Max. Länge
200
Beispiel
application/json
object
What one query resolved to.
string
The query this result answers, echoed back so a batch response can be matched to its request.
string
One of resolved (exactly one record), ambiguous (several equally good, none chosen) or not_found.
string | null
The resolved catalog id. Null on ambiguous and not_found, since an ambiguous query is deliberately not decided for you.
string | null
How the resolution was made, or null when nothing resolved. Never fuzzy: a suggestion is not a resolution.
number
Confidence in the resolution, 0 to 1. Derived from how much of the query a catalogued spelling accounted for and how strong that spelling is as evidence.
string[]
The words of the query a catalogued spelling accounted for.
string[]
The words it did not. Reported rather than guessed at: a variant we do not hold appears here instead of being silently dropped.
object[]
Other records this query could mean, best first. On ambiguous these are the tied candidates and choosing between them is yours.
string
The catalog id of this candidate.
string
The catalogued name of this candidate.
string | null
The maker, or null where the record has none.
string
How this candidate was matched. One of slug, name, alternate, shorthand, base (the name with its maker removed), family (the model designation with its trailing descriptor removed, e.g. M4 from M4 Carbine) or fuzzy.
string | null
The catalogued spelling that matched, or null for a fuzzy suggestion.
number
Confidence in this candidate, 0 to 1. Always 0 for a fuzzy suggestion, which is offered rather than scored.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires an API key with Builder tier or higher.
Call this before anything else when you are starting from text rather than from an id. Every other endpoint takes a catalog id; this is the only one that takes a name as somebody wrote it.
It is not search. /v1/firearms/search ranks a page of records about a query and has no notion of certainty. This answers which record a query is, and tells you when it cannot.
status: "ambiguous" is an answer, not a failure. "Glock 19" is three generations, so firearmId is null and all three come back in alternatives for you to choose between. Treating an ambiguous result as a resolution is how an agent ends up quoting the wrong barrel length.
Words the resolver could not place come back in unresolvedTokens rather than being dropped. A variant we do not hold appears there, which is more useful than being handed the base model as though it were the answer.
A fuzzy candidate is a suggestion offered when nothing matched at all. It always scores 0 and never appears as a resolution.
A query that matches nothing is a 200 with status: "not_found", not a 404. The request was answerable; the answer is that we hold no such record.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichStudio+
Resolve Many Names
The batch form of name resolution: up to 50 queries, one round trip, results returned in the order they were sent.
POST/v1/firearms/resolve
Studio+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
application/json
string[]erforderlich
The names to resolve. Between 1 and 50, each up to 200 characters.
application/json
object
The response payload.
object[]
One result per query, in the order the queries were sent.
string
The query this result answers, echoed back so a batch response can be matched to its request.
string
One of resolved (exactly one record), ambiguous (several equally good, none chosen) or not_found.
string | null
The resolved catalog id. Null on ambiguous and not_found, since an ambiguous query is deliberately not decided for you.
string | null
How the resolution was made, or null when nothing resolved. Never fuzzy: a suggestion is not a resolution.
number
Confidence in the resolution, 0 to 1. Derived from how much of the query a catalogued spelling accounted for and how strong that spelling is as evidence.
string[]
The words of the query a catalogued spelling accounted for.
string[]
The words it did not. Reported rather than guessed at: a variant we do not hold appears here instead of being silently dropped.
object[]
Other records this query could mean, best first. On ambiguous these are the tied candidates and choosing between them is yours.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
413PAYLOAD_TOO_LARGERequest body too large
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires an API key with Studio tier or higher.
Up to 50 queries in one request, results returned in the order they were sent. Each is scored exactly as the single form scores it.
This is the shape to use when extracting the firearms named in a document, a thread or a spreadsheet column. Resolving those one at a time is the difference between a call you can make inline and one you cannot.
One unknown name does not fail the batch. It comes back as a result with status: "not_found".
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichBuilder+
Compare Firearms
Returns full details for up to 5 firearms side by side.
GET/v1/firearms/compare
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Comma-separated firearm slugs, maximum 5
Beispiel
application/json
object
The response payload.
FirearmWithRelations[]
The compared firearms, in the order their ids were given.
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.
object[]
Per-field differences across the compared firearms, one entry per numeric field.
string
Which column the row is about, named as the database names it.
number | null[]
This field on each compared firearm, in the order the ids were given. Null where that record does not carry the field.
number | null
Lowest value across the compared firearms. Null when fewer than two of them carry the field.
number | null
Highest value across the compared firearms. Null when fewer than two of them carry the field.
number | null
Spread from the lowest value, as a percentage of it: (max - min) / min * 100, rounded to two places. Null when the minimum is zero or fewer than two records carry the field.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Get Firearm
Returns the full specification for a single firearm, including its manufacturer, category, calibers, images, and known users.
GET/v1/firearms/{id}
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Resource slug ID
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
application/json
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.
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.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichExplorer+
List Variants
Returns the direct variants of a firearm (its immediate children).
GET/v1/firearms/{id}/variants
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Firearm slug
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
application/json
FirearmVariant[]
The response payload.
string
URL-safe slug identifying the firearm, e.g. glock-17-gen5.
string
Display name, as the maker writes it.
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.
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.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichBuilder+
Get image asset
Returns the image bytes for one gallery entry. Defaults to the raw file with an immutable cache header; format=datauri returns a base64 data URI that drops straight into an <img src> with no second request. Images we link rather than host (external sources, asset-CDN paths) answer with a 302 to their location. Listing images and their credits is explorer-tier via /v1/firearms/{id}/images; the bytes are builder-tier, like the silhouette.
GET/v1/firearms/{id}/images/{imageId}
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Resource slug ID
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
stringerforderlich
Image row id from /v1/firearms/{id}/images
Beispiel
stringstandardraw
raw file, or a base64 data URI
Akzeptiert
Beispiel
stringstandardoriginal
Pre-rendered derivative; falls back to the original when absent
Akzeptiert
Beispiel
application/json
object
The response payload.
string
Slug of the firearm the image belongs to.
integer
Numeric id of the image within that firearm image set.
string
Size rendered: original, display or thumb.
string
Encoding of the returned image. datauri is the only format this route emits.
string
Media type of the encoded bytes.
string
The image inlined as an RFC 2397 data URI, ready to use as an <img src> with no second request.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichExplorer+
Index every firearm that has imagery
Returns each firearm with a render or photograph, and that imagery, as a three-field row. Built for media grids and mirroring jobs: paging the full catalogue with has_image=true returns fifteen fields per row, twelve of which such a caller discards. Silhouettes are excluded; every firearm has one. per_page allows up to 1000 here for the same reason.
GET/v1/firearms/media
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
integerstandard1
Page number
Bereich
1 – 10000
Beispiel
integerstandard250
Firearms per page
Bereich
1 – 1000
Beispiel
string
Restrict the images on each row to one kind
Akzeptiert
application/json
MediaCatalogEntry[]
One firearm and the real imagery it has. Deliberately three fields: this is the index for a media grid or a mirroring job, not a catalogue row. Silhouettes are excluded: every firearm has one, and they have their own build-time manifest.
string
Slug of the firearm this row is about.
string
Display name, as the maker writes it.
InlineMediaItem[]
The imagery on file for it, silhouette excluded, since every firearm has one of those.
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.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichExplorer+
All media
One resource for every kind of asset a firearm has, from line-art silhouette and generated render to photograph, schematic and 3D model, returned in a single shape.
GET/v1/firearms/{id}/media
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Resource slug ID
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
string
Return only one kind of asset
Akzeptiert
Beispiel
application/json
MediaItem[]
The response payload.
integer | null
Null for assets stored as a column rather than a row (the 3D model).
MediaKind
What kind of asset a media row is.
string | null
Media type of the bytes, e.g. image/png.
integer | null
Pixel width, where it is known.
integer | null
Pixel height, where it is known.
string | null
Alt text, where one has been written. Null otherwise, so do not render an empty string.
string
Absolute, directly fetchable URL.
object
Per-size URLs. Absent on assets we link rather than host.
string
URL of the asset at full size.
string
URL of the mid-size rendition, for a detail page.
string
URL of the thumbnail rendition, for a list or grid.
object
Attribution required to reuse the asset. Populated wherever the catalogue records it.
string | null
Where the record came from: a curated entry, an inference, or an import.
string | null
Who made the asset, where it is credited.
string | null
Page the asset or document was taken from.
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
Available on Explorer and above. The catalogue and its credits are free; the bytes are Builder.
Every url is absolute. You will never receive a bare storage key or an internal path.
Use ?kind= to fetch just what you need, e.g. ?kind=render for marketing imagery or ?kind=silhouette for UI icons.
The credit block is the attribution required to republish an image. Where license is set, honour it.
A firearm may have no assets of a given kind; the array is simply shorter, never an error.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichBuilder+
One asset
Fetch a single asset addressed either by kind (silhouette, render, photo, schematic, model) or by the numeric id from the list.
GET/v1/firearms/{id}/media/{selector}
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Resource slug ID
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
unknownerforderlich
Which asset: a kind, which resolves to the primary asset of that kind, or the numeric id of one row from /v1/firearms/{id}/media. Addressing by kind means never having to list first just to learn an id.
Akzeptiert
or a numeric id
Beispiel
stringstandardraw
Bytes, an inline data URI, or metadata only
Akzeptiert
Beispiel
stringstandardfull
Pre-rendered derivative; falls back to the original when absent
Akzeptiert
Beispiel
integerstandard0
Silhouettes only: inject a stroke so line art reads on any background
Bereich
0 – 20
Beispiel
stringstandardblack
Silhouettes only: stroke colour. Any CSS colour the browser understands; quotes, angle brackets, ampersands and backslashes are refused, because the value is written into an SVG attribute
Max. Länge
64
Beispiel
application/json
MediaItem
One asset belonging to a firearm. Every kind, whether silhouette, render, photo, schematic or 3D model, is returned in this same shape, and url is always absolute and directly fetchable.
integer | null
Null for assets stored as a column rather than a row (the 3D model).
MediaKind
What kind of asset a media row is.
string | null
Media type of the bytes, e.g. image/png.
integer | null
Pixel width, where it is known.
integer | null
Pixel height, where it is known.
string | null
Alt text, where one has been written. Null otherwise, so do not render an empty string.
string
Absolute, directly fetchable URL.
object
Per-size URLs. Absent on assets we link rather than host.
string
URL of the asset at full size.
string
URL of the mid-size rendition, for a detail page.
string
URL of the thumbnail rendition, for a list or grid.
object
Attribution required to reuse the asset. Populated wherever the catalogue records it.
string | null
Where the record came from: a curated entry, an inference, or an import.
string | null
Who made the asset, where it is credited.
string | null
Page the asset or document was taken from.
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 Builder tier or higher. Listing media and its credits is Explorer.
Address by kind (/media/silhouette) to skip the listing call entirely. This is the fastest way to pull an asset when you only know the firearm.
size=thumb is typically 10-20x smaller than full: on the AK-47 render that is 12KB against 528KB. Use it for grids, lists and HUD icons.
format=datauri without an explicit size automatically picks the largest variant under the 256KB cap, so embedding just works. Pass an explicit size if you need a specific one.
Assets we link rather than host, such as schematics, 3D models and externally sourced photos, answer with a 302 to their location.
stroke_width and stroke_color apply to silhouettes only and are ignored elsewhere.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichStudio+
Get Schematics
Returns exploded-view and technical schematic drawings for a firearm.
GET/v1/firearms/{id}/schematics
Studio+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Firearm slug
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
application/json
FirearmSchematic[]
The response payload.
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.
string
When the record was first added, YYYY-MM-DD HH:MM:SS in UTC.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
404NOT_FOUNDResource not found
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires Studio tier or higher. The same documents are embedded in the firearm detail response for Studio+ keys.
url is a path on the assets CDN. Prefix it with https://assets.gunspec.io to fetch the file.
Only Studio+ keys receive these URLs, and paths include an unguessable segment, so documents cannot be enumerated. The files themselves are served from the public CDN, so treat the URL as a shareable link, not a secret.
Reused documents carry source / author / license. Honour the license when you redistribute.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichBuilder+
Silhouette SVG
Returns the scalable line-art silhouette for a firearm, sized to its real-world dimensions.
GET/v1/firearms/{id}/silhouette
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Resource slug ID
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
stringstandardraw
An SVG file (raw; svg is accepted as the same thing, the name SDK 0.1.x used), an inline data URI, or the SVG source as JSON
Akzeptiert
Beispiel
integerstandard0
Inject a stroke so the line art reads on any background. 0 leaves it unstroked; anything above 20 is clamped to 20
Bereich
0 – 20
Beispiel
stringstandardblack
Colour of that stroke. Any CSS colour the browser understands: a name, a hex value, rgb(), oklch(), color-mix(). Quotes, angle brackets, ampersands and backslashes are refused, because the value is written into an SVG attribute
Max. Länge
64
Beispiel
application/json
object
The response payload.
string
Slug of the firearm.
string
Display name, as the maker writes it.
string
Slug of the line-art file, which is the firearm slug.
string
Which JSON form this is: datauri or svg.
string
Media type of the bytes, e.g. image/png.
string
Present when format=datauri: the SVG inlined as an RFC 2397 data URI.
string
Present when format=json: the SVG source, for parsing or manipulating in code.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
404NOT_FOUNDResource not found
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires Builder tier or higher.
Three formats: raw returns the SVG file directly, datauri returns a JSON-wrapped base64 data URI, json returns the SVG XML as a JSON string.
datauri is ideal for embedding: drop the value straight into <img src="">, CSS background-image: url(...), or Unity/Godot sprite loaders.
json is ideal for DOM injection (innerHTML = data.svg) or programmatic SVG manipulation (changing colors, extracting paths).
SVGs are high-quality vector illustrations that scale to any resolution without quality loss.
Silhouettes cover 2,500+ firearms including all major platforms.
stroke_width adds an outline stroke to every SVG path at the requested width (1-20px at native SVG resolution). Use values of 4-8 for small HUD icons and inventory thumbnails where thin lines would otherwise disappear. Omit for full-size renders.
stroke_color defaults to black. Set to white for dark backgrounds (e.g. game HUDs). URL-encode hex values: %23ff0000 for #ff0000.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichBuilder+
Get 3D model
Returns the glTF binary (.glb) for a firearm, ready to drop into a three.js or Babylon scene. Models are Draco-free but meshopt-compressed and carry WebP textures, so a loader needs EXT_meshopt_compression, EXT_texture_webp and KHR_mesh_quantization: all three are standard glTF extensions. Models we host on the asset CDN answer with a 302 to their location, the same as the image routes; models uploaded to our own bucket stream from here. 404 when the firearm has no model. use has_3d_model=true on /v1/firearms to list the ones that do.
GET/v1/firearms/{id}/model
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichBuilder+
Get Family Tree
Walks the parent chain upward and the variant chain downward, returning ancestors (up to 20) and descendants (up to 50) around the given firearm.
GET/v1/firearms/{id}/family-tree
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Firearm slug
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
application/json
FamilyTree
The firearm plus its ancestor and descendant variants, walked recursively.
FamilyMember[]
The parent chain, nearest first, up to 20 deep.
string
URL-safe slug identifying the related firearm, e.g. type-58.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
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.
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
Line-art silhouette, or null where none has been drawn.
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.
FirearmRecord
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.
FamilyMember[]
Everything derived from it, breadth-first, up to 50 rows.
string
URL-safe slug identifying the related firearm, e.g. type-58.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
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.
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
Line-art silhouette, or null where none has been drawn.
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.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
404NOT_FOUNDResource not found
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires Builder tier or higher.
Ancestors are returned root-first (oldest ancestor at index 0).
Descendants are returned in a flat array, depth-first.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichExplorer+
Find Similar
Returns the 10 most similar firearms in the same category, scored on shared calibers, manufacturer, action type, weight, barrel length, year, and capacity. Each result inlines its images array so a "you may also like" strip can be rendered from this one call.
GET/v1/firearms/{id}/similar
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Resource slug ID
Akzeptiert
a lowercase slug: letters, digits and hyphens
Beispiel
application/json
SimilarFirearm[]
The response payload.
string
Slug of the similar firearm.
string
Display name, as the maker writes it.
number
How alike the two records are, 0 to 1. Computed from the specifications, not from what people browse together.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
Slug of the category it belongs to. Resolve against /v1/categories.
string | null
ISO 3166-1 alpha-2 code of where it was designed, e.g. AT.
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
Line-art silhouette, or null where none has been drawn.
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.
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.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
404NOT_FOUNDResource not found
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires Explorer tier or higher.
Returns at most 10 results, sorted by similarity score descending.
Each result inlines its images array, so a related-products strip needs no follow-up request. For credits, licensing, or data-URI encoding, call /v1/firearms/{id}/media.
Die Werte gelten für die Mindeststufe dieses Endpunkts. Höhere Stufen erhöhen alle Limits.
Authentifizierung erforderlichExplorer+
Random Firearm
Returns one firearm at random, optionally constrained by category or country. Responses are sent with Cache-Control: no-store so every call is a fresh draw.
GET/v1/firearms/random
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
string
Restrict the draw to a category slug
Beispiel
string
Restrict the draw to an ISO country code
Beispiel
application/json
object
The response payload.
string
Slug of the drawn firearm.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer. Null where the maker is unrecorded.
string | null
Slug of the category the firearm belongs to.
integer | null
Year the model was introduced.
string | 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 the country of origin.
string | null
Operating action as stored, underscored, e.g. short_recoil, bolt_action, gas_operated. The full vocabulary is /v1/firearms/action-types; a hyphenated value matches nothing.
number | null
Unloaded weight in grams.
number | null
Barrel length in millimetres.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
404NOT_FOUNDResource not found
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Each request returns a different random firearm.
Combine with category or country filters to narrow the pool.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Head to Head
Returns a per-stat verdict between exactly two firearms, plus the win/loss/draw tally across all compared stats.
GET/v1/firearms/head-to-head
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
First firearm slug
Max. Länge
255
Beispiel
stringerforderlich
Second firearm slug
Max. Länge
255
Beispiel
application/json
object
The response payload.
HeadToHeadFirearm
One of the two compared firearms, as selected: the sixteen columns the verdicts are computed from, snake_case, under their database names.
string
URL-safe slug identifying the firearm. Stable: it is what a mirror keys on.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer. manufacturerId on the camelCase endpoints.
string | null
Slug of the category. categoryId on the camelCase endpoints.
number | null
Unloaded weight in grams, without magazine.
number | null
Overall length in millimetres.
number | null
Barrel length in millimetres, measured from the breech face.
integer | null
Standard magazine capacity, in rounds.
number | null
Muzzle velocity in metres per second, with the reference load.
number | null
Muzzle energy in joules, with the reference load.
number | null
Effective range in metres.
number | null
Cyclic rate of fire in rounds per minute; null for a semi-automatic or manual action.
HeadToHeadFirearm
One of the two compared firearms, as selected: the sixteen columns the verdicts are computed from, snake_case, under their database names.
string
URL-safe slug identifying the firearm. Stable: it is what a mirror keys on.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer. manufacturerId on the camelCase endpoints.
string | null
Slug of the category. categoryId on the camelCase endpoints.
number | null
Unloaded weight in grams, without magazine.
number | null
Overall length in millimetres.
number | null
Barrel length in millimetres, measured from the breech face.
integer | null
Standard magazine capacity, in rounds.
number | null
Muzzle velocity in metres per second, with the reference load.
number | null
Muzzle energy in joules, with the reference load.
number | null
Effective range in metres.
number | null
Cyclic rate of fire in rounds per minute; null for a semi-automatic or manual action.
object
One verdict per compared stat, keyed by the stat's camelCase name (weightEmptyG, overallLengthMm, barrelLengthMm, magazineCapacity, muzzleVelocityMps, muzzleEnergyJ, effectiveRangeM, rateOfFireRpm). A stat neither firearm carries is omitted, so the key set is the stats that could be compared.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
404NOT_FOUNDResource not found
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Requires Builder tier or higher.
verdicts is an object keyed by the camelCase stat name (weightEmptyG, magazineCapacity ...), not an array. Each entry carries winner (a, b or draw), both values, and better, which says what winning means for that stat (lighter, longer, higher ...).
A stat neither firearm carries is omitted; a firearm that carries a value beats one that does not.
a and b are the sixteen columns the verdicts are computed from, under their snake_case database names, the same rule as /v1/firearms/search.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Find by Archetype
Returns every firearm carrying game stats, classified into archetypes. Filter by archetype to get just that role roster.
GET/v1/firearms/game-meta
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
string
Restrict to a single archetype
Akzeptiert
application/json
GameProfile[]
The response payload.
string
Slug of the firearm this profile is for.
string
Display name, as the maker writes it.
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.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichExplorer+
List Action Types
Returns every distinct action type in the catalog with how many firearms use it.
GET/v1/firearms/action-types
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
application/json
object[]
The response payload.
string
The action type as stored, and the value to send as action_type when filtering.
string
Display name, as the maker writes it.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Pass data[].id to the action_type filter on GET /v1/firearms.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichExplorer+
Filter Options
Returns the distinct values available for each filterable field, for building filter UIs without hardcoding the options. Categories, manufacturers and calibers no firearm uses are omitted.
GET/v1/firearms/filter-options
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
application/json
object
The distinct filter values currently present in the catalog.
object[]
Manufacturers with at least one firearm.
string
Slug of the manufacturer, and the value to send as manufacturer.
string
Display name, as the maker writes it.
string | null
ISO 3166-1 alpha-2 code of where they are based, for grouping the list by country.
object[]
Categories with at least one firearm.
string
Slug of the category, and the value to send as category. Keyed slug here rather than id, unlike the other lists.
string
Display name, as the maker writes it.
object[]
Cartridges chambered by at least one firearm.
string
Slug of the cartridge, and the value to send as caliber.
string
Display name, as the maker writes it.
object[]
Operating actions present in the catalog.
string
The action type as stored, and the value to send as action_type.
string
Display name, as the maker writes it.
object[]
JSON array of notable features, as a string. The same vocabulary /v1/firearms/by-feature filters on.
string
The feature as stored, and the value to send as feature to /v1/firearms/by-feature.
string
Display name, as the maker writes it.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
One round-trip for an entire filter UI. Calibers are capped at the 100 most relevant.
Use categories[].slug, manufacturers[].id, calibers[].id, actionTypes[].id, and features[].id as filter values on GET /v1/firearms.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
By Feature
Returns firearms carrying a given feature slug, e.g. threaded-barrel or m-lok.
GET/v1/firearms/by-feature
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Feature name as stored, e.g. threaded barrel. The vocabulary is features on /v1/firearms/filter-options
Beispiel
string
Restrict to a category slug
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
object[]
One page of results
string
Slug of the firearm.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
Slug of the category it belongs to. Resolve against /v1/categories.
string | null
JSON array of every feature this firearm carries, as a string, not only the one filtered on.
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
Requires Builder tier or higher.
Common features: suppressor_ready, ambidextrous, picatinny_rail, threaded_barrel, adjustable_stock, folding_stock, free_float_barrel, match_trigger.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichExplorer+
By Action Type
Returns firearms using a given action type.
GET/v1/firearms/by-action
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Action type as stored, underscored, e.g. short_recoil. The vocabulary is /v1/firearms/action-types
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
object[]
One page of results
string
Slug of the firearm.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
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.
string | 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.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
By Material
Returns firearms whose named component is made of a given material.
GET/v1/firearms/by-material
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Material name
Beispiel
stringerforderlich
Which component the material applies to
Akzeptiert
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
object[]
One page of results
string
Slug of the firearm.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
Slug of the category it belongs to. Resolve against /v1/categories.
string | null
The material recorded for the component that was filtered on. Matched case-insensitively, returned as stored.
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
Requires Builder tier or higher.
Valid components: frame, barrel, stock, slide.
Material names are case-insensitive. Common values: polymer, steel, stainless_steel, aluminum_alloy, titanium, wood, carbon_fiber.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
By Designer
Returns firearms credited to a given designer.
GET/v1/firearms/by-designer
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Designer name. Matched as a substring, so a surname alone works
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
object[]
One page of results
string
Slug of the firearm.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
Slug of the category it belongs to. Resolve against /v1/categories.
string | null
Everyone credited on this firearm, as stored, not only the name filtered on.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichStudio+
By Conflict
Returns firearms recorded as used in a given armed conflict.
GET/v1/firearms/by-conflict
Studio+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
stringerforderlich
Conflict name
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
object[]
One page of results
string
Slug of the firearm.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
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.
string | null
Every conflict this firearm is recorded in, comma-separated, not only the one filtered on.
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
Requires Studio tier or higher.
Conflict data is extracted from the conflicts JSON field on each firearm record.
Use the /v1/conflicts endpoint to discover available conflict names.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Power Rating
Returns firearms scored on a 0-100 composite of muzzle energy (30%), effective range (25%), rate of fire (20%), magazine capacity (15%), and mobility (10%). Firearms without a recorded muzzle energy are excluded.
GET/v1/firearms/power-rating
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
string
Restrict the ranking to a category slug
Beispiel
integerstandard1
Page number, from 1 to 10,000
Bereich
1 – 10000
Beispiel
integerstandard20
Items per page (max 100)
Bereich
1 – 100
Beispiel
application/json
object[]
One page of results
string
Slug of the firearm.
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.
number
Composite score from 0 to 100, the sum of the weighted components in breakdown.
object
The weighted components powerRating is the sum of.
number
Muzzle-energy component, out of 30.
number
Effective-range component, out of 25.
number
Rate-of-fire component, out of 20.
number
Magazine-capacity component, out of 15.
number
Mobility component, out of 10. Lighter and shorter scores higher.
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
Requires Builder tier or higher.
Power rating is a weighted composite: muzzle energy (35%), effective range (25%), rate of fire (20%), magazine capacity (20%).
Firearms missing required spec fields are excluded from rankings.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichBuilder+
Timeline
Returns firearms ordered by year of introduction, optionally bounded to a period. Firearms without a recorded introduction year are excluded.
GET/v1/firearms/timeline
Builder+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
integer
Earliest year of introduction
Beispiel
integer
Latest year of introduction
Beispiel
string
Restrict to a category slug
Beispiel
integerstandard1
Page number
Bereich
1 – 10000
Beispiel
integerstandard50
Items per page (max 100)
Bereich
1 – 100
Beispiel
stringstandardasc
Sort order
Akzeptiert
Beispiel
application/json
TimelineEntry[]
One page of results
string
URL-safe slug identifying the firearm, e.g. glock-17-gen5.
string
Display name, as the maker writes it.
string | null
Slug of the manufacturer that makes it. Resolve against /v1/manufacturers/{id}.
string | null
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.
integer | null
Year production ended, or null while it is still made.
string | 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
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
Requires Builder tier or higher.
Results are sorted by year_introduced ascending.
Firearms without a known year_introduced are excluded.
Dieser Aufruf beantwortet bedingte Anfragen. Speichern Sie das ETag einer Antwort und senden Sie es als If-None-Match zurueck: ein unveraenderter Datensatz liefert 304 Not Modified ohne Body. Das zaehlt auf Ihr Minutenlimit, aber nicht auf Ihr Tageskontingent.
Authentifizierung erforderlichExplorer+
Popular Firearms
Returns firearms ranked by recorded view activity over a trailing window.
GET/v1/popular/firearms
Explorer+
stringHeadererforderlich
Ihr API-Schlüssel. Authorization: Bearer <key> wird ebenfalls akzeptiert.
integerstandard7
Trailing window in days
Bereich
1 – 30
Beispiel
integerstandard10
How many to return
Bereich
1 – 20
Beispiel
application/json
PopularFirearm[]
The response payload.
string
Slug of the firearm. Named entity_id because the rollup counts views of any entity kind; it is id on the catalog endpoints.
string
Display name of the firearm.
string | null
Slug of the manufacturer. manufacturerId on the camelCase endpoints.
string | null
Slug of the category. categoryId on the camelCase endpoints.
string | null
ISO 3166-1 alpha-2 code of the country of origin.
integer | null
Year the model was introduced.
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
Line-art silhouette, or null where none has been drawn.
integer
Views recorded inside the trailing window given by days.
integer
Distinct visitors behind those views. Forty views from one reader is a different fact from forty readers.
400VALIDATION_ERRORValidation error
401UNAUTHORIZEDAPI key required
403FORBIDDENValid key, not permitted
429RATE_LIMITEDRate limit exceeded
500INTERNAL_ERRORUnexpected server error
Ranking is based on anonymised view analytics, refreshed daily.
The window is capped at 30 days and the result set at 20 firearms.