VulnCheck · OpenAPI Overlay 1.0.0

API Evangelist enhancements to the VulnCheck API v3 OpenAPI

7 actions 7 updates documentation extends ../openapi/_original/vulncheck-api-openapi-original.json
Generated by API Evangelist Written by API Evangelist tooling for VulnCheck's API. It is a proposal applied on top of the contract, not a document VulnCheck publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

descriptionx-support-urlx-status-pagex-changelog429

Targets 7

$.servers
$.components.securitySchemes.Bearer
$.security
$.info
$.info.description
$.tags
$.paths.*.*.responses

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements to the VulnCheck API v3 OpenAPI
  version: 1.0.0
extends: ../openapi/_original/vulncheck-api-openapi-original.json
x-generated: '2026-09-04'
x-method: generated
x-source: >-
  Derived from openapi/_original/vulncheck-api-openapi-original.json (fetched verbatim from
  https://api.vulncheck.com/v3/openapi on 2026-09-04) plus
  https://docs.vulncheck.com/getting-started/api-tokens,
  https://docs.vulncheck.com/community/rate-limits, and live header probes.
x-note: >-
  Every action below adds information the provider publishes ELSEWHERE but did not put in the
  spec. Nothing here invents behaviour. The original document is never mutated; the working
  copy at openapi/vulncheck-api-openapi.json carries only action 1 (the absolute server URL)
  so that generated clients resolve against the documented host.
actions:
- target: $.servers
  description: >-
    The published spec declares a RELATIVE server, "/v3", which cannot be resolved by any
    client that did not fetch the document from the API host itself. Replace it with the
    absolute base every VulnCheck code sample and SDK uses.
  update:
  - url: https://api.vulncheck.com/v3
    description: VulnCheck API v3
- target: $.components.securitySchemes.Bearer
  description: >-
    The scheme is declared as a bare apiKey in the Authorization header with no description.
    Document the token's provenance, its three accepted transports and its expiry, all of which
    are published at https://docs.vulncheck.com/getting-started/api-tokens.
  update:
    description: >-
      VulnCheck API token, sent as "Authorization: Bearer <token>". The same token is also
      accepted as a `token` query parameter and as a `token` cookie. Issue and revoke tokens at
      https://console.vulncheck.com/settings/tokens. A token unused for 30 days expires. The
      CLI and SDKs read it from the VC_TOKEN environment variable.
- target: $.security
  description: >-
    The spec declares no top-level security requirement, so a generated client reads the API as
    anonymous. In fact every operation except GET /v3/openapi returns 401 without a token
    (probed 2026-09-04). Apply the Bearer scheme globally.
  update:
  - Bearer: []
- target: $.info
  description: Add contact and license context the provider publishes on its site.
  update:
    x-support-url: https://www.vulncheck.com/contact
    x-status-page: https://status.vulncheck.com/
    x-changelog: https://docs.vulncheck.com/changelog
- target: $.info.description
  description: >-
    Expand the one-line description into what the API actually covers, so a catalog or agent
    reading only the spec understands the surface.
  update: >-
    Version 3 of the VulnCheck API — read-only access to VulnCheck exploit and vulnerability
    intelligence. 508 named indices are individually addressable at /index/{name}, alongside
    CVE search, CPE and PURL lookup, initial-access detection rules (Suricata and Snort),
    VulnCheck C2 hostname and IP feeds, account entitlements, and pre-signed offline backup
    downloads. Authentication is a VulnCheck API token. Community accounts are limited to
    1,000 requests per minute.
- target: $.tags
  description: >-
    The document declares an EMPTY top-level tags array while tagging all 521 operations, so
    no tag carries a description. Declare the tag groups the operations already use.
  update:
  - name: Indices
    description: Browse and query VulnCheck's 508 named data feeds.
  - name: Search
    description: Cross-index CVE search and CPE component search.
  - name: Component Identity
    description: CPE and PURL lookups returning associated CVEs.
  - name: Threat Intelligence
    description: VulnCheck C2 hostname and IP feeds, and initial-access detection rules.
  - name: Backups
    description: Pre-signed download links for offline index archives.
  - name: Account
    description: Entitlement inspection and specification self-service.
- target: $.paths.*.*.responses
  description: >-
    HTTP 429 is documented at https://docs.vulncheck.com/community/rate-limits with a concrete
    body, but is declared on NONE of the 521 operations. Add it so generated clients handle
    exhaustion rather than treating it as an unknown status.
  update:
    '429':
      description: >-
        Too Many Requests. Community accounts are limited to 1,000 requests per minute across
        all endpoints. No Retry-After or RateLimit-* header is returned; back off exponentially.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: boolean
              errors:
                type: array
                items:
                  type: string
          example:
            error: true
            errors:
            - Rate limit exceeded. Please try again later.
x-unfixable-gaps:
  note: >-
    Recorded rather than patched — these need a change by VulnCheck, and an overlay that
    invented values for them would be fabrication.
  gaps:
  - id: missing-operation-ids
    detail: >-
      None of the 521 operations declares an operationId. Every generated SDK must synthesize
      method names from paths, and no artifact in this repo (including the MCP tool crosswalk)
      can bind to a stable operation identifier. This is the single highest-value fix available
      to VulnCheck on this contract.
  - id: untyped-error-bodies
    detail: >-
      The 400/401/404/500 responses are typed as a bare `string` on every operation, though the
      real body is the {"error":true,"errors":[...]} envelope. A shared components.schemas.Error
      referenced from each would make failures machine-readable.
  - id: untyped-search-source
    detail: >-
      index.CveSearchHit.source is typed `object` with the description "Structure varies by
      index" — the payload a /search/cve caller most needs described is the one left undescribed.
  - id: no-examples
    detail: No operation carries a response example, so no example can be lifted into examples/.
  - id: under-declared-401
    detail: 401 is declared on 1 of 521 operations while applying to 520 of them.