# PyPI Changelog Between Versions

> PyPI Changelog Between Versions is a paid API for AI agents from upgrade-brief.shopttyass-85f.workers.dev, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-28).

Returns full release notes, breaking changes, and dependency changes for every version of a Python package between two specified versions, newest first.

## Facts

- Endpoint: GET https://upgrade-brief.shopttyass-85f.workers.dev/pypi/changelog?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-28
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/pypi-changelog-between-versions-13ad5e7e
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_Xk3pozrfFVSZ9XtQDjf_9

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability pypi-changelog-between-versions-13ad5e7e
```

Example prompt: What changed in pydantic going from version 1.10.13 to 2.0? Show me the release notes, any breaking changes, and whether the Python version requirement or dependencies changed.

## When to prefer this

Use this endpoint when you need the full release notes and structured breaking-change data for a Python package version range before performing or recommending an upgrade. It saves the agent from fetching and parsing long CHANGES/HISTORY files manually. Prefer it over the PyPI Breaking Changes endpoint when you want complete release notes in addition to just breaking changes, or when you need publish dates, bump types, yanked flags, and dependency diffs across multiple versions in one call.

## Known failure modes

- Package not found on PyPI — returns error with package name
- Invalid version format — returns 400 with message about PEP 440 compliance
- 'from' version newer than 'to' version — returns empty releases array
- No changelog found — releases returned with null notes fields
- GitHub rate limiting without token — degraded:true flag set, fewer release notes available
- Network timeout fetching upstream changelog — partial results or error response

## How this service works

PyPI changelog between two versions of a Python package: the full release notes of every version in the range (newest first, up to 100) from the project's changelog file and GitHub releases, with publish dates, bump type, yanked flags, extracted breaking changes and Requires-Python / dependency changes. One call instead of reading a long HISTORY or CHANGES file before a Python package upgrade.

## Output

A JSON object containing: list of releases in the version range (newest first, up to 100), each with version, publish date, bump type (major/minor/patch), markdown release notes (up to 6,000 chars), breaking changes array, source URL, yanked flag, and truncated flag. Also includes a top-level summary string, ecosystem identifier, manifest changes (added/changed/removed dependencies and Requires-Python delta), total versionsInRange count, and a degraded flag if GitHub was accessed without an API token.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "package",
      "from"
     ],
     "properties": {
      "to": {
       "type": "string",
       "default": "latest",
       "description": "Target version: exact, or a major/minor prefix ('5', '5.1') resolved to the first stable release of that series (5.0.0). Default: the latest stable release ('latest')"
      },
      "from": {
       "type": "string",
       "description": "Version you are on now: exact ('1.10.13', '2.0'), or a major/minor prefix ('1', '4.2') resolved to its newest stable release (PEP 440)"
      },
      "package": {
       "type": "string",
       "description": "PyPI project name, e.g. 'pydantic', 'django' or 'flask'"
      },
      "maxVersions": {
       "type": "integer",
       "default": 30,
       "maximum": 100,
       "minimum": 1,
       "description": "Newest N versions of the range to return notes for"
      },
      "prereleases": {
       "enum": [
        "true",
        "false"
       ],
       "type": "string",
       "default": "false",
       "description": "Include alpha/beta/rc/canary versions in the range"
      }
     },
     "additionalProperties": false
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "package",
      "from",
      "to",
      "releases"
     ],
     "properties": {
      "to": {
       "type": "string"
      },
      "asOf": {
       "type": "string"
      },
      "from": {
       "type": "string"
      },
      "notes": {
       "type": "array",
       "items": {
        "type": "string"
       }
      },
      "latest": {
       "type": [
        "string",
        "null"
       ],
       "description": "Latest stable version"
      },
      "package": {
       "type": "string"
      },
      "sources": {
       "type": "array",
       "items": {
        "type": "string"
       }
      },
      "summary": {
       "type": "string"
      },
      "degraded": {

… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "to": "3.0.0",
  "from": "2.3.3",
  "package": "flask",
  "summary": "flask 2.3.3 -> 3.0.0: 1 versions; returning 1 newest first, 1 with release notes.",
  "releases": [
   {
    "bump": "major",
    "notes": "Released 2023-09-30\n\n-   Remove previously deprecated code. ...",
    "source": "changelog (repository)",
    "version": "3.0.0",
    "breaking": [
     "Remove previously deprecated code."
    ],
    "sourceUrl": "https://github.com/pallets/flask/blob/HEAD/CHANGES.rst",
    "truncated": false,
    "deprecated": null,
    "publishedAt": "2023-09-30T00:00:00Z"
   }
  ],
  "ecosystem": "pypi",
  "manifestChanges": {
   "flags": [
    "Dependency range changed: werkzeug >=2.3.7 -> >=3.0.0"
   ],
   "dependencies": {
    "added": {},
    "changed": {
     "werkzeug": {
      "to": ">=3.0.0",
      "from": ">=2.3.7"
     }
    },
    "removed": []
   },
   "requiresPython": {
    "to": ">=3.8",
    "from": ">=3.8"
   }
  },
  "versionsInRange": 1
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/pypi-changelog-between-versions-13ad5e7e/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from upgrade-brief.shopttyass-85f.workers.dev](https://www.zero.xyz/host/upgrade-brief.shopttyass-85f.workers.dev/llms.txt)
