Compatibility

List attachments

The attachment catalog: stocks, grips, handguards, optics, mounts, muzzle devices, suppressors, magazines, lights, bipods, slings, triggers and adapters. requires=<standard> narrows to what needs a given interface. Browsing is open to any key. fits=<firearm> runs the compatibility engine and therefore needs Studio, the same as the dedicated fit endpoints.

Available on every plan. Requires an API key; Explorer keys receive a reduced field set.

get/v1/attachments

Request

  • Base URL: https://api.gunspec.io
  • URL: https://api.gunspec.io/v1/attachments
  • Auth: one of:
    • API key in header X-API-Key
    • HTTP bearer

Query parameters

pageinteger

Page number, from 1 to 10,000

per_pageinteger

Items per page (max 100)

categorystring

Attachment category

manufacturerstring

Manufacturer slug

fitsstring

Only attachments that fit this firearm

requiresstring

Only attachments requiring this interface standard

qstring

Substring match on name

factoryboolean

Only factory parts (true) or only aftermarket (false)

status'in_production' | 'discontinued' | 'limited'

Production status. The catalog keeps discontinued parts on purpose, so a store front asks for in_production

vendorstring

Restrict to one seller. me resolves to the vendor your key belongs to

only_offeredboolean

Drop anything that seller does not currently stock. Needs a resolvable vendor, and yields nothing without one

Headers

If-None-Matchstring

The ETag from a previous response. If the body would be byte-identical, the API answers 304 Not Modified with no body. A 304 counts toward the per-minute rate limit but not the daily request allowance.

Response

List attachments

successboolean required

Always true on a successful response. Every error carries false and an error object instead.

Example response

{
  "success": true,
  "data": [
    {
      "id": "magpul-zhukov-s-stock",
      "name": "Zhukov-S Stock",
      "category": "stock",
      "manufacturer": {
        "id": "magpul",
        "name": "Magpul Industries"
      },
      "modelNumber": "MAG585",
      "weightG": 490,
      "lengthMm": 240,
      "statMods": {
        "mobility": 3,
        "recoil_control": 2
      },
      "specDeltas": {
        "folded_length_mm": 705
      },
      "imageUrl": "https://assets.gunspec.io/content/attachments/optic/aimpoint-acro-p-2/01-product.webp",
      "dataConfidence": 0.9,
      "updatedAt": "2026-09-07 12:56:03",
      "version": "e27e61b4b373f5a621d6ae5c67d521096131f2cf56300a1b2c3d4e5f6a7b8c9d",
      "provenance": {
        "sources": [
          "https://www.glock.com/en/products/pistols/g17-gen5"
        ],
        "sourceKinds": [
          {
            "url": "https://www.glock.com/en/products/pistols/g17-gen5",
            "kind": "manufacturer",
            "archivedFrom": null,
            "rank": 0,
            "tier": "authority",
            "basis": "declared",
            "evidence": null
          }
        ],
        "makerSource": "https://www.glock.com/en/products/pistols/g17-gen5",
        "evidence": "maker",
        "checks": {
          "raised": 3,
          "history": [
            {
              "task": "verify:firearms:glock-g17-gen5",
              "number": 1204,
              "check": "quality:firearm-weight-fits-its-size",
              "kind": "verify",
              "agent": "redback",
              "worker": "redback-046535",
              "status": "resolved",
              "decidedAt": "2026-09-25 07:42:39",
              "proposed": "Read https://us.glock.com/en/pistols/g17-gen5: agrees on barrel_length, weight.",
              "fields": [
                "barrel_length_mm",
                "weight_empty_g"
              ],
              "sources": [
                "https://us.glock.com/en/pistols/g17-gen5"
              ],
              "finding": {
                "why": "2.22 g/cm3 against a submachine-gun / carbon-steel median of 0.64; check the weight and the dimensions",
                "evidence": {
                  "apparentDensity": 2.218,
                  "categoryMedian": 0.635
                }
              }
            }
          ]
        },
        "dataConfidence": 0.95,
        "verifiedAt": "2026-09-08",
        "verifiedFields": [
          "barrel_length_mm",
          "weight_empty_g"
        ],
        "updatedAt": "2026-09-08 04:10:22",
        "version": "ba5c1d9e06c279a5"
      },
      "provides": []
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 20,
    "limit": 20,
    "total": 42,
    "totalPages": 3
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.