Firearm Analysis

Compare the point-blank and supersonic range of each firearm

Returns, for each of up to 5 firearms firing a load, its maximum point-blank range: the furthest distance at which the bullet stays within half the target's diameter of the line of sight all the way from the muzzle, at the zero that makes that distance longest. With it come that zero (the far zero), the near zero where the bullet first rises through the line of sight, the peak, the time of flight and the velocity at the range, and the supersonic range.

The trajectory is the one /v1/firearms/{id}/load flies: the same load, the firearm's own barrel and the same solver, in the ICAO standard atmosphere at sea level (15 °C, 101.325 kPa). It is flown at every metre, so every distance is to the metre. With no ammo_id, each firearm fires the load its ballistic profile uses; the sights sit at the height that profile assumes for the firearm's category unless sight_height_mm says otherwise.

Every input has a default, and target.defaulted names the ones the answer assumed. Each trajectory is flown to 2500 m; a range that reaches it is at least that far, and the answer says so.

Requires Builder tier or higher.

get/v1/firearms/point-blank

Request

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

Query parameters

idsstring required

Comma-separated firearm slugs, maximum 5.

ammo_idstring

The load every firearm fires. Without it, each fires the load its ballistic profile uses.

target_mmnumber

The target's diameter in mm: the bullet must stay within half of it above and below the line of sight.

sight_height_mmnumber

Height of the sights above the bore in mm. Default: the height the ballistic profile assumes for the firearm's category.

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

Compare the point-blank and supersonic range of each firearm

successboolean required

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

Example response

{
  "success": true,
  "data": {
    "method": {
      "id": "maximum-point-blank-range",
      "name": "Maximum point-blank range on the API trajectory",
      "citations": [
        {
          "authors": "Sporting Arms and Ammunition Manufacturers' Institute (SAAMI)",
          "year": 2018,
          "title": "Gun Recoil, Technical: Free Recoil Energy",
          "journal": "SAAMI technical sheet, Rev. 7/9/2018",
          "url": "https://saami.org/wp-content/uploads/2025/03/Gun-Recoil-Formulae-2018-07-9.pdf"
        }
      ],
      "resolutionM": 1,
      "maxRangeM": 2500
    },
    "atmosphere": {
      "name": "ICAO standard atmosphere at sea level",
      "temperatureC": 15,
      "pressureKpa": 101.325,
      "airDensityKgM3": 1.225,
      "speedOfSoundMps": 340.294
    },
    "target": {
      "diameterMm": 200,
      "radiusMm": 100,
      "defaulted": [
        "sight_height_mm"
      ]
    },
    "results": [
      {
        "firearm": {
          "id": "hk416",
          "name": "HK416",
          "categoryId": "assault-rifle",
          "barrelLengthMm": 264
        },
        "ammunition": {
          "id": "m855",
          "name": "M855 Ball (SS109)",
          "caliberId": "5-56x45mm-nato",
          "bulletWeightG": 4.02
        },
        "muzzleVelocityMps": 825,
        "sight": {
          "heightMm": 38
        },
        "pointBlank": {
          "rangeM": 281,
          "nearZeroM": 21,
          "farZeroM": 238,
          "peakM": 138,
          "peakHeightMm": 100,
          "boreAngleMrad": 2.043,
          "timeOfFlightS": 0.36,
          "velocityMps": 738
        },
        "supersonic": {
          "rangeM": 1105,
          "timeOfFlightS": 1.856
        },
        "delta": {
          "rangeM": -7,
          "farZeroM": -6
        }
      }
    ]
  }
}

Changes

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