[Agent Tools](https://tools.openkrill.app/) / [Blog](https://tools.openkrill.app/blog)

# PostgreSQL 13, Node.js 20 and Python 3.9 end-of-life dates: how to check EOL status and upgrade targets

Upgrade tickets and dependency audits stall when a coding agent guesses whether a runtime or database release cycle still gets security patches. We checked PostgreSQL 13, Node.js 20 LTS and Python 3.9 against the [Dev Facts Check](https://tools.openkrill.app/tools/dev-facts) MCP server, the upstream `endoflife.date` REST API, the `endoflife.ai` MCP server and the `norwegianblue` CLI.

By OpenKrill. Published 2026-10-20. We read all EOL dates, final patch numbers and supported upgrade cycles below from `https://devfacts.openkrill.app/mcp` (backed by `endoflife.date`) on 2026-10-19 at 06:06 UTC and 2026-10-20 at 07:20 UTC.

## The short answer

All three release lines have reached end-of-life as of October 2026. Python 3.9 reached EOL on 2025-10-31 at version `3.9.25`. PostgreSQL 13 reached EOL on 2025-11-13, after final release `13.23` (shipped 2025-11-10). Node.js 20 LTS reached EOL on 2026-04-30, after release `20.20.2` (shipped 2026-03-24).

Calling `get_eol_status` on the free [Dev Facts Check](https://tools.openkrill.app/tools/dev-facts) MCP server (`https://devfacts.openkrill.app/mcp`) returns both the requested cycle's `release` object and the `supportedCycles` list in one response.

## Three common EOL checks and their supported upgrade targets

This is what `get_eol_status` returned across our 2026-10-19 and 2026-10-20 runs for PostgreSQL 13, Node.js 20 and Python 3.9:

| Product and cycle | Status (`isEol`) | Release date (`releasedOn`) | EOL date (`eolFrom`) | Latest patch (`latest.name`) | Supported upgrade cycles (`supportedCycles`) |
| --- | --- | --- | --- | --- | --- |
| PostgreSQL `13` | EOL (`true`) | 2020-09-24 | 2025-11-13 | `13.23` (2025-11-10) | `14` (EOL 2026-11-12), `15` (2027-11-11), `16` (2028-11-09), `17` (2029-11-08), `18` (2030-11-14) |
| Node.js `20` (LTS from 2023-10-24) | EOL (`true`) | 2023-04-18 | 2026-04-30 | `20.20.2` (2026-03-24) | `22` LTS (EOL 2027-04-30), `24` LTS (2028-04-30), `26` (2029-04-30) |
| Python `3.9` | EOL (`true`) | 2020-10-05 | 2025-10-31 | `3.9.25` (2025-10-31) | `3.11` (EOL 2027-10-31), `3.12` (2028-10-31), `3.13` (2029-10-31), `3.14` (2030-10-31), `3.15` (2031-10-31) |

## Active PostgreSQL release cycles in October 2026

If your team is migrating off PostgreSQL 13, note that PostgreSQL 14 reaches end-of-life on `2026-11-12`, less than one month away. This is the `supportedCycles` list `get_eol_status` returned for `postgresql` on 2026-10-20:

| Major cycle | LTS flag (`isLts`) | Latest minor version (`latest`) | End-of-life date (`eolFrom`) |
| --- | --- | --- | --- |
| PostgreSQL 18 | `false` | `18.6` | 2030-11-14 |
| PostgreSQL 17 | `false` | `17.11` | 2029-11-08 |
| PostgreSQL 16 | `false` | `16.15` | 2028-11-09 |
| PostgreSQL 15 | `false` | `15.19` | 2027-11-11 |
| PostgreSQL 14 | `false` | `14.24` | 2026-11-12 |

## How 4 EOL lookup options compared on PostgreSQL 13

We ran the same PostgreSQL 13 check across 4 tools on 2026-10-19:

| Tool | Time | What a single query returns | Install or key needed |
| --- | --- | --- | --- |
| [Dev Facts Check](https://tools.openkrill.app/tools/dev-facts) MCP (`get_eol_status`) | 1,027 ms | Target cycle `release` (`eolFrom: "2025-11-13"`, `latest.name: "13.23"`) plus all 5 `supportedCycles` | None (remote HTTP MCP server, no API key) |
| `endoflife.date` REST API (`/api/v1/products/postgresql/releases/13`) | 522 ms | Single cycle JSON (`isEol: true`, `eolFrom: "2025-11-13"`, `name: "13.23"`). Listing active cycles takes a second call | None (public REST endpoint, our upstream data source) |
| `endoflife.ai` MCP server | 1,623 ms | Full product JSON across all historical PostgreSQL cycles | None (remote HTTP MCP server) |
| `norwegianblue` CLI (`npx norwegianblue postgresql`) | 2,165 ms | Markdown table of all 18 cycles. It does not isolate a single cycle in structured JSON | Requires local Python or Node CLI execution |

To check any product and release cycle on [Dev Facts Check](https://tools.openkrill.app/tools/dev-facts) (see also the [ChatGPT integration guide](https://tools.openkrill.app/integrations/dev-facts/chatgpt) and the [Claude integration guide](https://tools.openkrill.app/integrations/dev-facts/claude)), send this JSON-RPC call:

```
{"method":"tools/call","params":{"name":"get_eol_status",
 "arguments":{"product":"postgresql","version":"13"}}}
```

## Frequently asked questions

### When did PostgreSQL 13 reach end-of-life, and what is the last 13.x version?

PostgreSQL 13 reached end-of-life on 2025-11-13. Its final minor release was 13.23, shipped on 2025-11-10. As of October 2026 the supported PostgreSQL major cycles are 14 (EOL 2026-11-12), 15 (EOL 2027-11-11), 16 (EOL 2028-11-09), 17 (EOL 2029-11-08) and 18 (EOL 2030-11-14).

### Is Node.js 20 LTS still supported in October 2026?

No. Node.js 20 entered Long Term Support on 2023-10-24, ended active support on 2024-10-22, and reached end-of-life on 2026-04-30 at version 20.20.2. The supported Node.js release lines are 22 LTS (EOL 2027-04-30), 24 LTS (EOL 2028-04-30) and 26 (EOL 2029-04-30).

### What else does Dev Facts Check look up besides single-product EOL dates?

The MCP server at https://devfacts.openkrill.app/mcp provides 6 tools with no API key (up to 60 calls a minute per network): get_eol_status, check_runtime_eol (batch EOL check across repo config files or a runtimes list), check_license (SPDX license permissions, conditions and limitations), check_browser_support (Baseline web feature support across browsers), lookup_rfc (IETF RFC metadata) and get_release_notes.

### Where does get_eol_status get its release and support dates?

It reads live cycle data from endoflife.date (https://endoflife.date), which tracks release dates, latest patch versions, LTS windows and end-of-life dates across more than 400 software products.

## Sources

- PostgreSQL 13, Node.js 20 and Python 3.9 EOL lookups: [Dev Facts Check MCP server](https://tools.openkrill.app/tools/dev-facts) (`https://devfacts.openkrill.app/mcp`), read on 2026-10-19 at 06:06 UTC and 2026-10-20 at 07:20 UTC.
- Upstream cycle data: [endoflife.date/postgresql](https://endoflife.date/postgresql), [endoflife.date/nodejs](https://endoflife.date/nodejs) and [endoflife.date/python](https://endoflife.date/python).
- Vendor release policies: [PostgreSQL Versioning Policy](https://www.postgresql.org/support/versioning/), [Node.js Release Working Group Schedule](https://github.com/nodejs/release#release-schedule) and [Status of Python Versions (PEP 602)](https://devguide.python.org/versions/).
- Rival benchmarks: [endoflife.date API v1](https://endoflife.date/docs/api/v1/), [endoflife.ai MCP](https://mcp.endoflife.ai/mcp) and [norwegianblue CLI](https://github.com/hugovk/norwegianblue), tested on 2026-10-19.
