---
title: Changelog entries between two versions of a package (upgrade intelligence)
description: >-
  Given a package and a from/to version, returns the ordered release entries in
  the half-open range (from, to] — from exclusive (you have it), to inclusive —
  with summaries, breaking-change verdicts (#1
---
# Changelog entries between two versions of a package (upgrade intelligence)

`GET https://api.releases.sh/v1/whats-changed`

Given a `package` and a `from`/`to` version, returns the ordered release entries in the half-open range `(from, to]` — `from` exclusive (you have it), `to` inclusive — with summaries, breaking-change verdicts (#1696), and migration notes. One call instead of N changelog pages.

Reads already-ingested releases only (no live fetch). Resolution is read-only: an exact catalog source-slug match, then a non-materializing GitHub `owner/repo` coordinate match. An unresolvable package returns `status: "unknown"` with HTTP 200 — a valid answer, not an error; npm/PyPI names absent from the catalog resolve to `unknown` until the name→source map (#1345) lands. Wide ranges are truncated to a token budget (newest entries kept), flagged via `truncated`.

**Auth:** optional Bearer token.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `package` | query | string | yes | Package identifier — a catalog source slug or a GitHub "owner/repo" coordinate. |
| `from` | query | string | yes | Version you're upgrading FROM (exclusive). |
| `to` | query | string | yes | Version you're upgrading TO (inclusive). |
| `ecosystem` | query | "npm" \| "pypi" \| "github" | no | Optional resolution hint. `github` enables the coordinate match for a bare owner/repo. |

**Responses**

- `200` Upgrade range (resolved or unknown — both are 200)
- `400` Missing/invalid query parameters

Full request and response schemas: [OpenAPI 3.1 spec](https://api.releases.sh/v1/openapi.json).
