# Stack Facts

> Check a package before install: malware, known vulnerabilities (OSV), exploited CVEs (CISA KEV) and end-of-life, plus LLM prices; signed answers, pay per call in USDC, no account or API key. Sources: OSV.dev, CISA KEV, endoflife.date, LiteLLM and models.dev.

Free sample: `curl -s https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/eol`. Paid calls cost $0.001 to $0.05 in USDC over x402 v2 exact on Base: call the route, take the price from the 402 PAYMENT-REQUIRED header, pay and retry with PAYMENT-SIGNATURE. x402 v1 clients can pay the offer in the 402 body instead and retry with X-PAYMENT. No account or API key. Errors are never charged.

Updated 2026-10-12. Version 0.5.0. Base URL: https://g5joilnmeep4ntz3nwezxt5dmu.srv.us

## Quick start

```sh
# Free: signed samples, same shape as the paid answers
curl -s 'https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/eol'
curl -s 'https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/kev'
curl -s 'https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/preview'
# Free: check an id before paying
curl -s 'https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/validate?dataset=eol&id=nodejs'
# Paid: 402 with the price in the PAYMENT-REQUIRED header (base64 JSON) and the body
curl -si 'https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/kev/CVE-2021-44228'
curl -si -X POST 'https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/check' -H 'content-type: application/json' -d '{"items":[{"product":"nodejs","version":"18.19.0"},{"product":"python","version":"3.12.4"}]}'
```

## Examples

- [curl.md](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/examples/curl.md): curl: a free call, then a paid route's 402 and its PAYMENT-REQUIRED header decoded
- [fetch-x402.mjs](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/examples/fetch-x402.mjs): Node 18+, no dependencies: an x402 client that pays one call (add a viem account as the signer)
- [python_x402.py](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/examples/python_x402.py): Python 3 standard library: the same client (add an EIP-712 signer)

## Prices

USD per call, paid in USDC on Base (eip155:8453). Atomic USDC (USD x 1,000,000) is the 402 amount.

| Method | Route | Tool | USD | Atomic USDC |
|---|---|---|---|---|
| GET | `/v1/eol/{product}` | `stackfacts_eol_product` | 0.001 | 1000 |
| GET | `/v1/eol/{product}/{cycle}` | `stackfacts_eol_cycle` | 0.001 | 1000 |
| POST | `/v1/eol/check` | `stackfacts_eol_check` | 0.01 | 10000 |
| GET | `/v1/eol/check` | `stackfacts_eol_check` | 0.01 | 10000 |
| GET | `/v1/eol/image` | `stackfacts_eol_image` | 0.005 | 5000 |
| GET | `/v1/eol/snapshot` | `stackfacts_eol_snapshot` | 0.05 | 50000 |
| GET | `/v1/kev/{cve}` | `stackfacts_kev_lookup` | 0.002 | 2000 |
| POST | `/v1/kev/check` | `stackfacts_kev_check` | 0.005 | 5000 |
| GET | `/v1/kev/changes` | `stackfacts_kev_changes` | 0.01 | 10000 |
| GET | `/v1/kev/snapshot` | `stackfacts_kev_snapshot` | 0.05 | 50000 |
| GET | `/v1/models/{provider}/{model}` | `stackfacts_models_lookup` | 0.002 | 2000 |
| POST | `/v1/models/estimate` | `stackfacts_models_estimate` | 0.002 | 2000 |
| POST | `/v1/models/cheapest` | `stackfacts_models_cheapest` | 0.008 | 8000 |
| GET | `/v1/models/changes` | `stackfacts_models_changes` | 0.02 | 20000 |
| GET | `/v1/models/snapshot` | `stackfacts_models_snapshot` | 0.05 | 50000 |
| POST | `/v1/stack/check` | `stackfacts_stack_check` | 0.012 | 12000 |
| POST | `/v1/stack/watch` | `stackfacts_stack_watch` | 0.012 | 12000 |
| POST | `/v1/osv/check` | `stackfacts_osv_check` | 0.005 | 5000 |
| POST | `/v1/preflight` | `stackfacts_preflight` | 0.008 | 8000 |

## Paid tools

- [stackfacts_eol_product](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/nodejs): GET /v1/eol/{product}, $0.001. List every release cycle of a product (Node.js, Python, Ubuntu…) and if it is still supported: EOL (end-of-life) date, support status, LTS, latest version. Keywords: EOL; end-of-life dates; support status; is <product> <version> still supported; release cycles; LTS; endoflife.date.
- [stackfacts_eol_cycle](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/python/3.12): GET /v1/eol/{product}/{cycle}, $0.001. Check if a version is still supported (is python 3.12 still supported?): one release cycle, its EOL (end-of-life) date, support status, LTS, latest patch. Keywords: is <product> <version> still supported; EOL; end-of-life date; support status; support until; latest patch version; LTS.
- [stackfacts_eol_check](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/check): POST /v1/eol/check or GET /v1/eol/check, $0.01. Check dependencies, runtimes and OS versions for EOL: is each still supported? Up to 50 product@version pairs to cycle, end-of-life date and support status. Keywords: check my stack for end-of-life versions; is <product> <version> still supported; EOL; support status; dependency EOL audit; batch end-of-life check.
- [stackfacts_eol_image](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/image?image=node%3A18-alpine3.19): GET /v1/eol/image, $0.005. Check a container image for EOL: is node:18-alpine still supported? Maps its runtime, Java and base OS to end-of-life date and support status. Keywords: is my docker image end-of-life; container base image EOL; is <product> <version> still supported; Dockerfile FROM audit; EOL; support status; base OS end-of-life.
- [stackfacts_eol_snapshot](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/snapshot): GET /v1/eol/snapshot, $0.05. Download the signed EOL (end-of-life) snapshot (endoflife.date, MIT): support status of every product and cycle, still supported or not, plus its manifest. Keywords: EOL; end-of-life dataset download; support status; is <product> <version> still supported; endoflife.date bulk; signed snapshot.
- [stackfacts_kev_lookup](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/kev/CVE-2021-44228): GET /v1/kev/{cve}, $0.002. Check if a CVE is actively exploited (CISA KEV): in_kev, date added, remediation due date, required action and known ransomware use. Keywords: check if a CVE is actively exploited (CISA KEV); known exploited vulnerability; CISA KEV lookup; CVE exploited in the wild.
- [stackfacts_kev_check](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/kev/check): POST /v1/kev/check, $0.005. Check up to 100 CVEs at once against CISA KEV (known exploited vulnerabilities); returns in_kev and the KEV details for each one. Keywords: check if a CVE is actively exploited (CISA KEV); batch CVE check; vulnerability scan triage; known exploited vulnerabilities.
- [stackfacts_kev_changes](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/kev/changes?since=kev-20261009T040000Z-7bd60fe8): GET /v1/kev/changes, $0.01. List CVEs added to, removed from or changed in CISA KEV since a snapshot_id, so an agent can poll for newly exploited vulnerabilities. Keywords: new CISA KEV entries; newly exploited vulnerabilities; KEV change feed; check if a CVE is actively exploited (CISA KEV).
- [stackfacts_kev_snapshot](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/kev/snapshot): GET /v1/kev/snapshot, $0.05. Download the full signed CISA KEV snapshot: every known exploited vulnerability, with a manifest to verify the sha256 and signature. Keywords: CISA KEV download; known exploited vulnerabilities catalog; signed snapshot.
- [stackfacts_models_lookup](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/openai/gpt-4o): GET /v1/models/{provider}/{model}, $0.002. Get an LLM model's price per million tokens (input, output, cached), context window, max output, capabilities and model deprecation date. Keywords: price per million tokens; context window; model deprecation date; LLM pricing; max output tokens.
- [stackfacts_models_estimate](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/estimate): POST /v1/models/estimate, $0.002. Estimate the USD cost of an LLM call from input, output and cached token counts, exact to the micro-dollar, with the price lines used. Keywords: LLM cost estimate; price per million tokens; token cost calculator; how much will this prompt cost.
- [stackfacts_models_cheapest](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/cheapest): POST /v1/models/cheapest, $0.008. Find the cheapest model with tools and 128k context, or any limits you set: ranks the 10 cheapest LLMs by blended price per million tokens. Keywords: cheapest model with tools and 128k context; cheapest LLM; price per million tokens; context window; model comparison.
- [stackfacts_models_changes](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/changes?since=models-20261009T050000Z-044bcb8b): GET /v1/models/changes, $0.02. List LLM models added, removed or changed (price per million tokens, context window, model deprecation date) since a snapshot_id. Keywords: LLM price changes; model deprecation date; new LLM models; price per million tokens.
- [stackfacts_models_snapshot](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/snapshot): GET /v1/models/snapshot, $0.05. Download the full signed LLM model catalogue (LiteLLM + models.dev, MIT): prices, limits and capabilities, with a verifiable manifest. Keywords: LLM pricing dataset; price per million tokens; context window; signed snapshot.
- [stackfacts_stack_check](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/stack/check): POST /v1/stack/check, $0.012. Check dependencies, runtimes and OS versions in one call: OSV advisories for up to 50 package purls, EOL status for 50 product@version pairs, CISA KEV hits. Keywords: check my stack for end-of-life versions and exploited CVEs; stack audit; EOL, package vulnerabilities and KEV in one call; is <product> <version> still supported; dependency risk check; known exploited vulnerabilities.
- [stackfacts_osv_check](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/osv/check): POST /v1/osv/check, $0.005. Check dependencies for known vulnerabilities: up to 50 package purls (npm, PyPI, Go, crates.io, Maven) against OSV.dev, with fixed versions and CISA KEV flags. Keywords: check my dependencies for known vulnerabilities; is <package> <version> vulnerable; OSV; purl; npm PyPI Go crates.io Maven advisories; GHSA; fixed version; known exploited vulnerabilities; malicious package check.
- [stackfacts_preflight](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/preflight): POST /v1/preflight, $0.008. Call before installing a package an LLM suggested: one npm, PyPI or purl version against OSV, CISA KEV and EOL data. Returns ok, warn or block with reasons. Keywords: call before installing a package an LLM suggested; npm install check; pip install check; package preflight; malicious package check; known exploited vulnerabilities; OSV; purl.
- [stackfacts_stack_watch](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/stack/watch): POST /v1/stack/watch, $0.012. Check dependencies, runtimes and OS versions for what changed since your last call: EOL passed or near, new OSV advisories, new CISA KEV hits. Returns a token. Keywords: watch my stack for end-of-life and new exploited CVEs; Use when you need to know what changed in a stack since your last check; stack monitor; dependency monitor; what changed since my last check; alert when a version reaches end of life; new vulnerabilities in my packages.

## Free tools

- [stackfacts_preview](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/preview): GET /v1/{dataset}/preview, free. Preview a dataset for free: sample end-of-life products, the newest CISA KEV entries or LLM prices, signed like the paid answers. Keywords: free sample; end-of-life dates; CISA KEV; price per million tokens.
- [stackfacts_try](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/kev): GET /v1/try/{dataset}, free. Try a paid answer for free on a fixed example: nodejs end-of-life cycles, CVE-2021-44228 in CISA KEV, or openai/gpt-4o prices. Keywords: free example; try before paying; check if a CVE is actively exploited (CISA KEV).
- [stackfacts_index](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/models/index): GET /v1/{dataset}/index, free. List the valid ids for free: end-of-life product names and aliases, or LLM provider/model ids, so a paid call never misses. Keywords: product list; model list; valid ids; aliases.
- [stackfacts_validate](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/validate?dataset=eol&id=nodejs): GET /v1/validate, free. Validate an id for free before paying: whether a product, product/cycle or provider/model exists, or a CVE id is well formed. Keywords: validate id; check before paying; product exists.
- [stackfacts_manifest](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/eol/manifest): GET /v1/{dataset}/manifest, free. Get the signed manifest of a dataset's latest snapshot for free: snapshot_id, sha256, record count, source, licence and signature. Keywords: signed manifest; snapshot_id; data freshness; provenance.
- [stackfacts_keys](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/keys): GET /v1/keys, free. Get the Ed25519 public keys (JWK) that verify the signature on every answer and snapshot manifest. Keywords: public key; verify signature; JWKS; Ed25519.

## Stack watch

`POST /v1/stack/watch` ($0.012 a call, start or re-check) answers what changed in a stack since your last call. Start with a stack, as for `POST /v1/stack/check`: the answer holds the full check and a signed token, `data.watch.token`. Later send `{"token": "<watch.token>"}`: the answer lists each change since then (an end-of-life date passed or near, a CVE newly in CISA KEV, a new OSV advisory) with `worst` (high, medium, low or null for no change) and a new token for the next call.

- The token holds your stack in readable form; keep it as you would the stack. It is signed, so a changed token is refused (token_invalid), and it is good for 180 days.
- No watch state is stored: the token is the whole watch. Lose it and you start again.
- Data refreshes every 4 h (KEV), 6 h (OSV) and 24 h (EOL), so a sooner re-check finds nothing new; `watch.suggested_recheck_at` is the next refresh that matters.
- A start token is at most 32,000 characters and a re-check token at most 48,000; over that the call is 413 too_many_items, not charged: split the stack into two watches.

## Datasets

- Software end-of-life dates (`/v1/eol/…`): endoflife.date, MIT, refreshed every 24 h. Snapshot `eol-20261011T184823Z-fb3e9d0a`, as of 2026-10-11T18:48:23Z, 483 records. Free sample: [/v1/try/eol](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/eol).
- Actively exploited CVEs (CISA KEV) (`/v1/kev/…`): CISA KEV, CC0-1.0, refreshed every 4 h. Snapshot `kev-20261009T183031Z-bc476d6c`, as of 2026-10-09T18:30:31Z, 1739 records. Free sample: [/v1/try/kev](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/kev).
- LLM prices, context windows and deprecation dates (`/v1/models/…`): LiteLLM + models.dev, MIT, refreshed every 12 h. Snapshot `models-20261010T070852Z-7d710157`, as of 2026-10-10T07:08:52Z, 368 records. Free sample: [/v1/try/models](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/try/models).

Data is provided as is, without warranty of any kind. Payments are final. Every dataset is normalised (modified) from the sources named here, and no source endorses this service.

## Machine-readable

- [openapi.json](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/openapi.json): OpenAPI 3.1 with x-payment-info on every paid operation
- [pricing.json](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/pricing.json): paid routes and prices
- [/.well-known/x402](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/.well-known/x402): paid resources (x402scan and IETF draft shapes)
- [/.well-known/api-catalog](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/.well-known/api-catalog): RFC 9727 linkset
- [MCP server card](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/.well-known/mcp/server-card.json): the same tools over MCP (Streamable HTTP) at `POST https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/mcp`
- [/v1/keys](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/v1/keys): Ed25519 public keys (JWK) for verifying answers and snapshots

## Docs

- [End-of-life pages](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/eol/nodejs): is a product end-of-life? One page per product at /docs/eol/<product> (483 products, all in sitemap.xml)
- [Newest KEV CVEs](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/kev-recent): the 20 newest actively exploited CVEs
- [LLM model changes](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/models-changes): price and deprecation changes in the last 7 days
- [Cheapest LLMs by context size](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/models-cheapest): the 5 cheapest models with at least 32k, 128k, 200k, 1M tokens of context
- [MCP setup](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/mcp): copy-paste MCP configs for Claude Code, Cursor and Codex
- [Compared with the free sources](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/compare): what each free source gives and what Stack Facts adds
- [Errors](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/docs/errors): error codes and what to do
- [Provenance](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/provenance): sources, refresh schedule and snapshot verification
- [Licences](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/licences): licences and attribution for every source
- [Changelog](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/changelog): service changes
- [Health](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/health): status and freshness of each dataset

## Optional

- [llms-full.txt](https://g5joilnmeep4ntz3nwezxt5dmu.srv.us/llms-full.txt): every tool with its input schema, a curl call and an example answer; errors; provenance; licences
