Plugins
Data sourceCommercialMarketplace
endoflife.ai EOL logo

endoflife.ai EOL

endoflife.ai

Get plugin

endoflife.ai EOL data source for Grafana

Query end-of-life dates and EOL Risk Scores for 700+ software products from endoflife.ai, as tables you can use in any Grafana panel: table, stat, gauge, bar gauge, or as the input to transformations and joins with your own inventory data.

Version 1.0.4. A commercial plugin for distribution through the Grafana Marketplace, licensed under the End-User Licence Agreement.

What it does

  • Three query types: Version score, Product versions and Batch.
  • Every query returns one table-shaped data frame with typed columns (dates as time fields, numbers as numbers), and the same columns for all three types, so a panel can be switched between them.
  • Dashboard variables: list every tracked product slug, or the versions of one product.
  • Grafana template variables work inside the product, version and batch inputs.
  • The API key is stored encrypted by Grafana and added on the server. It never reaches the browser.

Requirements

  • Grafana 12.3 or later.
  • Outbound HTTPS from the Grafana server to api.endoflife.ai. Requests go through Grafana's data source proxy; browsers do not call the API directly.

Configure

Connections > Data sources > Add new data source > endoflife.ai EOL.

Setting Required Notes
API key Yes A key is issued with your Marketplace subscription and carries its request allowance and batch size. A free key, which does not expire, is available at https://endoflife.ai/api#free-key. The API answers data requests only with a valid key; without one, queries fail with HTTP 401.

Save & test calls GET /v1 on the API. With a valid key it reports success, with the API version, your key's tier and its request allowance. The API answers a request with no key, or with a key it does not recognise, as anonymous, and Save & test then reports an authentication error that asks for a valid key. That applies to provisioned data sources too. If the call itself fails, the test shows the HTTP error.

The key is sent as the X-API-Key header by the proxy route declared in plugin.json.

Provisioning

The data source can be provisioned from a file. The API key is required. A minimal example:

apiVersion: 1
datasources:
  - name: endoflife.ai EOL
    type: endoflifeai-eol-datasource
    access: proxy
    # required: your endoflife.ai API key, stored encrypted by Grafana
    secureJsonData:
      apiKey: ${EOL_API_KEY}

Set EOL_API_KEY in Grafana's environment. Run Save & test on the provisioned data source to confirm the key is accepted.

Query types

All three return these columns:

Column Type Meaning
product string Product slug
version string Release cycle
status string active, warn (end of life within 180 days), eol, unknown; not-tracked or error for a pair that could not be answered
eol_date time End of life date (midnight UTC). Empty when the vendor publishes no date
days_until_eol number Set while the date is in the future
days_past_eol number Set once the date has passed
score number EOL Risk Score, 0 to 100 (methodology: https://endoflife.ai/risk-score)
band string Risk band for the score
grade string Letter grade for the score
cisa_kev_exposure number The CISA Known Exploited Vulnerabilities factor of the score
extended_support_available boolean Whether a commercial extended support option exists for the product
extended_support_date time End of the vendor's own extended or paid phase, where one is published
eol_date_source string Provenance of the date, for example vendor-fetched or upstream
eol_date_confidence string Confidence grade of the date
latest_release string Latest release in the cycle
release_date time First release of the cycle
score_card_url string Link to the score card on endoflife.ai
error string The API's message for a row that could not be answered

1. Version score

Inputs: product slug and version, for example python and 3.10. Calls GET /v1/score/{product}/{version}. One row: the version's end-of-life date, days until or past that date, EOL Risk Score with band and grade, the CISA KEV factor, whether extended support exists, and where the date comes from. Leave the version blank to get the product's highest-risk tracked version (GET /v1/score/{product}).

A product or version the API does not know gives one row with status not-tracked, not a panel error.

2. Product versions

Input: product slug, for example postgresql. Calls GET /v1/product/{product}. One row per tracked version of the product, each with its status, end-of-life date and score.

An unknown product gives an empty table with a warning notice that carries the API's message and its closest slug suggestions.

3. Batch

Input: one product version pair per line. product:version is also accepted, blank lines and lines starting with # are skipped, and a line with only a product asks for its highest-risk version.

python 3.10
postgresql 13
mysql 8.0
not-a-real-product 1

Calls POST /v1/batch. The API limits the batch size by tier, so the plugin reads the tier once from GET /v1, splits the list into groups of that size and sends at most four requests at a time. Rows come back in input order. A pair the API does not know becomes a row with status not-tracked, empty values and the API's message in error; it never fails the panel. HTTP-level failures (for example a rate limit answer) are shown as a panel error with the API's message.

Answers are cached in the browser session for five minutes, so a refreshing dashboard does not spend the daily allowance on identical questions.

Dashboard variables

Add a variable of type Query on this data source:

Query Result
products (or blank) Every tracked product slug
versions(python) or versions($product) The tracked versions of one product

Known limits

  • Frontend plugin with a proxy route; there is no backend component, so Grafana alert rules cannot use it yet.
  • Package URL (purl) and SBOM lookups offered by the API are not exposed yet.

Privacy

The plugin sends only product names and versions to api.endoflife.ai, plus your API key. It sends no hostnames, no inventory identifiers, no dashboard content and no user information. Requests are made by your Grafana server through its data source proxy.

Pricing and licence

The plugin is sold through the Grafana Marketplace once it is listed there; the catalog listing shows the current price. Use is governed by the End-User Licence Agreement. What the plugin sends and stores is described in the privacy note.

Support

Written support by email: partners@endoflife.ai. Corrections to lifecycle data are published at https://endoflife.ai/accuracy.

Development

Build and test steps, the API calls behind each query type and sample outputs captured from the live API are in DEVELOPMENT.md, next to this README in the plugin's source code.

Contact: partners@endoflife.ai

Grafana Cloud

Connect any plugin in Grafana Cloud.

  • 150+ data source integrations
  • Grafana Assistant - AI that correlates your data, builds queries, and answers questions
  • 10k Prometheus metrics + 50 GB logs, traces, and profiles on the free tier
  • ...and more
Create free account