---
title: "Changelog entries between two versions of a package (upgrade intelligence)"
method: GET
path: "/whats-changed"
tags: ["Releases"]
---

# Changelog entries between two versions of a package (upgrade intelligence)

`GET /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`.

## Query parameters

- `package` string, required
- `from` string, required
- `to` string, required
- `ecosystem` 'npm' | 'pypi' | 'github'

## Response `200`

Upgrade range (resolved or unknown — both are 200)

- object
  - `status` 'resolved' | 'unknown', required
  - `package` string, required
  - `ecosystem` 'npm' | 'pypi' | 'github', nullable, required
  - `from` string, required
  - `to` string, required
  - `source` object, nullable, required
    - `sourceId` string, required
    - `sourceSlug` string, required
    - `orgSlug` string, required
  - `entries` object[], required
    - `version` string, nullable, required
    - `publishedAt` string, nullable, required
    - `title` string, nullable, required
    - `summary` string, nullable, required
    - `breaking` 'unknown' | 'none' | 'minor' | 'major', required
    - `migrationNotes` string, nullable, required
    - `url` string, nullable, required
    - `webUrl` string, nullable, required
  - `count` number, required
  - `truncated` boolean, required
  - `truncatedAtTokens` number

## Other responses

- `400` — Missing/invalid query parameters

---

[API](https://skmtc.net/releases/apis/releases-api.md) · [All operations](https://skmtc.net/releases/apis/releases-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/releases/releases-api/revisions/168e32061f53/schema)
