Data Quality

Get catalog gaps and integrity checks

Two kinds of problem, reported separately.

Gaps are absent values, counted per entity and field, with the share of records left filled. Media is the same question for visual material, which a field count cannot answer: a line drawing is a column but photographs, renders and 3D models are rows in a media table. Checks are present values that contradict something else the catalog states, such as a firearm attributed to a manufacturer that does not exist, or a company recorded as closing before it was founded. Each check returns a verdict and a sample of the identifiers that failed.

Built for a backend rather than a reader. /v1/data/coverage reports how full a table is; this reports which records to correct. Pair it with /v1/data/gaps/records to retrieve the identifiers and pass them to whatever fills them in.

Pass entity to report on a single catalog. Every check is a scan of a catalog table, so a scoped call runs only the checks that concern that catalog and is substantially cheaper.

linkHealth is declared and reports unavailable. Establishing whether a cited website still resolves requires one network request per record, which belongs in a scheduled job rather than a request handler. It is declared here so that a consumer knows the shape it will arrive in.

No API key required.

get/v1/data/gaps

Request

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

Query parameters

entity'manufacturers' | 'firearms' | 'calibers' | 'attachments' | 'ammunition'

Report on one catalog instead of all of them. Every check is a scan of a catalog table, so a scoped call runs only the checks that concern that catalog and is the cheaper request by a wide margin. Omitted, the whole report comes back.

Response

Get catalog gaps and integrity checks

successboolean required

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

Example response

{
  "success": true,
  "data": {
    "scope": "manufacturers",
    "schedule": {
      "computedAt": "2026-09-15T02:44:57.731Z",
      "cadence": "daily",
      "lastRunAt": "2026-09-15 03:00:12",
      "lastRunOn": "2026-09-15",
      "nextRunAt": "2026-09-16T03:00:00.000Z",
      "sourceAuditAt": "2026-09-15 03:00:41"
    },
    "media": [
      {
        "entity": "firearms",
        "total": 8629,
        "none": 6159
      }
    ],
    "checks": [
      {
        "id": "firearm-manufacturer-exists",
        "describes": "Every firearm is attributed to a manufacturer that exists in the catalog.",
        "status": "pass",
        "values": [
          {
            "value": "dao",
            "count": 15
          }
        ]
      }
    ]
  }
}

Changes

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