gunspec-io Health API

Health and readiness checks

Operations 2

GET /health Health check #
GET /ready Readiness check #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/gunspec-io:gunspec-io-health-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

gunspec-io-health-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: GunSpec.io Health API
  version: 1.1.0
  description: 'Comprehensive firearms specification database API. ## Authentication


    All `/v1` endpoints accept an API key via **`X-API-Key`** header or **`Authorization: Bearer `**. Some endpoints are accessible without a key (anonymous tier), while others require a minimum subscription tier. The tier required by each endpoint is stated in its description. ## Plans and limits


    | Tier | Price | Requests/month | Daily cap | Rate limit | Max page depth |

    |------|-------|----------------|-----------|------------|----------------|

    | Explorer | $0 | 200 | 50 | 10/min | 5 |

    | Builder | $29/mo | 25,000 | 5,000 | 60/min | 25 |

    | Studio | $79/mo | 150,000 | 10,000 | 120/min | Unlimited |

    | Enterprise | $249/mo | 1,000,000 | 50,000 | 300/min | Unlimited |


    **Explorer**: For evaluation and testing

    - 200 requests/month

    - 10 requests/min

    - Try any endpoint up to Studio with 50 one-time credits

    - Basic fields

    - 5 pages max


    **Builder**: For indie developers and side projects

    - 25,000 requests/month

    - 60 requests/min

    - Full specs

    - Compare endpoint

    - 25 pages max


    **Studio**: For production applications

    - 150,000 requests/month

    - 120 requests/min

    - All endpoints

    - Unlimited pages

    - Priority support


    **Enterprise**: For high-volume use, and for retailers advertising stock across the catalog

    - 1,000,000 requests/month

    - 300 requests/min

    - All endpoints

    - Unlimited pages

    - Seller listing on every part and firearm you stock

    - Your logo, price and stock, linking to your own checkout

    - Listed in the API too, so partner sites carry your offers

    - Price in your own currency, shown to the regions you ship to

    - Dedicated support

    - SLA


    Anonymous requests (no API key) are treated as Explorer with a 50 request/day cap. ## Rate Limiting


    Three limits can refuse a call with `429`. The per-minute limit returns `RATE_LIMITED` with `Retry-After: 60`. The daily limit, counted per key, returns `DAILY_CAP_EXCEEDED`: nothing is served until it resets at midnight UTC, `Retry-After` is the seconds left until then (at most 86,400), and the body carries `error.limit`, `error.resetsAt` (an ISO 8601 instant) and `error.retryAfter`. The monthly allowance, which is the plan''s requests per month and belongs to the whole account (every key draws on one pool), returns `MONTHLY_CAP_EXCEEDED` in the same shape, with `Retry-After` up to 2,678,400 and the reset at midnight UTC on the first of next month. Only calls that were served spend the month: a call a limit refused, and a `304`, do not. Whichever limit is reached first refuses, and when both are, the monthly one is the one reported because it lasts longer. What is left of the **day** and of the **month** is sent on every response, so a script never has to ask. Every `/v1` response on a plan with a daily limit carries `X-Daily-Limit`, `X-Daily-Remaining` and `X-Daily-Reset` (the UTC midnight it rolls over at, as an ISO 8601 instant), a response to a call made with a key also carries `X-Monthly-Limit`, `X-Monthly-Remaining` and `X-Monthly-Reset` (midnight UTC on the first of next month), and a call through the hosted MCP server carries `X-Daily-MCP-*` beside them. A plan with no daily limit sends none of them. `Remaining` is what is left after the call that returned it, so the response that reports `0` is the last one that will be served: stop there and resume at `Reset`. Treat `Remaining` as a figure to pace against rather than settle on: it is served from a short cache while you are well under the limit and read live once you are near it, so it can read high by about a minute of traffic early in the day. `GET /v1/me/usage` is the figure to reconcile against, and the one that shows every key at once. Stop at the first `DAILY_CAP_EXCEEDED`. A call made after it is refused too and still counted, and a free key that keeps calling after being refused is paused (`403` with `KEY_ON_HOLD` and a `Retry-After`) until the limit resets or the account moves to a paid plan. Signing in, the portal and billing are not affected by a pause.'
  contact:
    name: GunSpec.io
    url: https://gunspec.io
  license:
    name: Proprietary
    url: https://gunspec.io/terms
servers:
- url: https://api.gunspec.io
  description: This API
tags:
- name: Health
  description: Health and readiness checks
paths:
  /health:
    get:
      tags:
      - Health
      summary: Health check
      description: Liveness probe. Answers 200 whenever the API worker is running, and deliberately does not touch the database, so it stays green through a database incident. Use `/ready` to know whether requests will succeed. No authentication, no rate limit, and a flat body rather than the `{ success, data }` envelope.
      operationId: getHealth
      security: []
      responses:
        '200':
          description: The API worker is running
          headers:
            Cache-Control:
              description: 'Always `no-cache`: the answer is computed on every call, so a monitor never reads a stale one.'
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                type: object
                required:
                - status
                - timestamp
                - version
                - environment
                properties:
                  status:
                    type: string
                    enum:
                    - ok
                    example: ok
                    description: Always `ok`. Getting an answer at all is the signal; there is no degraded value.
                  timestamp:
                    type: string
                    format: date-time
                    example: '2026-09-11T07:35:44.688Z'
                    description: When the probe answered, ISO 8601 UTC. A value that does not move between calls means something in between is caching the reply.
                  version:
                    type: string
                    example: v1
                    description: 'The API version every endpoint is served under: the `v1` in `/v1/...`. Not a build number.'
                  environment:
                    type: string
                    enum:
                    - production
                    - staging
                    - development
                    example: production
                    description: 'Which deployment answered: `production` (api.gunspec.io), `staging`, or `development` for a worker running locally.'
  /ready:
    get:
      tags:
      - Health
      summary: Readiness check
      description: 'Readiness probe. Runs one query against the database: 200 `ready` when it answers, 503 `not_ready` when it does not, so a load balancer or status page can tell "the API is up" from "the API can serve data". No authentication, no rate limit, and a flat body rather than the `{ success, data }` envelope.'
      operationId: getReady
      security: []
      responses:
        '200':
          description: The database answered the probe query
          headers:
            Cache-Control:
              description: 'Always `no-cache`: the answer is computed on every call, so a monitor never reads a stale one.'
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                type: object
                required:
                - status
                - database
                properties:
                  status:
                    type: string
                    enum:
                    - ready
                    example: ready
                    description: Always `ready` on a 200.
                  database:
                    type: string
                    enum:
                    - connected
                    example: connected
                    description: The database answered the probe query.
        '503':
          description: The database did not answer the probe query
          headers:
            Cache-Control:
              description: 'Always `no-cache`: the answer is computed on every call, so a monitor never reads a stale one.'
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                type: object
                required:
                - status
                - database
                properties:
                  status:
                    type: string
                    enum:
                    - not_ready
                    example: not_ready
                    description: Always `not_ready` on a 503.
                  database:
                    type: string
                    enum:
                    - disconnected
                    example: disconnected
                    description: The probe query failed or the database could not be reached. Requests that read the catalog fail until it recovers; retry after a short wait.
components:
  securitySchemes:
    ApiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: API key passed via X-API-Key header
    BearerAuth:
      type: http
      scheme: bearer
      description: 'API key passed via Authorization: Bearer header'