GitHub Releases & Package Release Notes
Pricing
from $1.80 / 1,000 releases
GitHub Releases & Package Release Notes
Get releases from GitHub, npm, PyPI, crates.io, feeds and changelog pages in one format. Batch targets and filter versions. Pay per returned release.
Pricing
from $1.80 / 1,000 releases
Rating
0.0
(0)
Developer
mia.cx
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
Give an agent releases from several projects in one format, with optional date or version filters. Read GitHub, npm, PyPI, crates.io, RSS/Atom feeds and changelog pages. Registry releases and GitHub tags contain version metadata without note bodies. Each delivered release costs $0.0018, plus $0.00005 per run start at default memory.
Try it
{"targets":["npm:ky"],"limit":1}
Empty input {} requests up to three releases each for npm:ky, pypi:requests and crates:serde.
No upstream key is required. An optional caller-supplied githubToken enables authenticated GitHub requests.
Use from an agent
Add https://mcp.apify.com?tools=miacx/github-releases-package-release-notes to your MCP client and sign in to Apify.
Call the dedicated Actor tool, then use get-dataset-items to read the completed run's dataset.
Or set APIFY_TOKEN to your Apify API token and call the API:
curl --fail-with-body 'https://api.apify.com/v2/actors/miacx~github-releases-package-release-notes/run-sync-get-dataset-items' \-H "Authorization: Bearer $APIFY_TOKEN" -H 'Content-Type: application/json' \-d '{"targets":["npm:ky"],"limit":1}'
What you get
The dataset contains one row per delivered release, plus unbilled failed-target and zero-release status rows.
Read status first. An ok row with releases: 0 is a target summary, not a delivered release.
One failed target does not stop the rest of the batch.
This row comes from replaying the recorded npm fixture through the Actor adapter with a fixed test clock:
{"target": "npm:ky","status": "ok","version": "2.2.0","date": "2026-10-09T06:32:47.556Z","title": "ky 2.2.0","body": null,"url": "https://www.npmjs.com/package/ky/v/2.2.0","breaking": false,"source": "https://registry.npmjs.org/ky","fetchedAt": "1970-01-01T00:00:00.000Z"}
version is null when the source supplies no detectable version. Leading v is removed.
date is a UTC timestamp or YYYY-MM-DD for sources that supply only a day; undated releases have null dates.
body is source Markdown or converted feed/changelog text. It is null for registries, tags and sources without notes.
url is null when unavailable. Changelog releases link to the page, without heading anchors.
breaking is a heuristic based on note markers or versions starting a new caret compatibility line.
It flags X.0.0, 0.Y.0, 0.0.Z and their prereleases, including a project's first release.
It can miss unmarked breaking changes. It does not establish upgrade compatibility.
The key-value store's OUTPUT record reports each target, including errors and targets with no releases.
Successful summaries include delivered releases, budget withheld, truncated and sinceSkipped counts.
chargeLimitReached reports whether any releases were withheld.
truncated means more matches may exist; sinceSkipped counts entries whose date or version cannot be compared.
Input
| Field | Default | Accepted input |
|---|---|---|
targets | ["npm:ky","pypi:requests","crates:serde"] | 1–500 strings or objects from the target table below. An empty array is invalid. |
sinceDate | "" | Keep releases strictly after a date or timestamp. Empty means no filter. |
limit | 3 | 1–100 releases per target after filtering. |
githubToken | Omitted | Optional caller-supplied token sent only to api.github.com. Empty means unauthenticated access. |
| Target kind | Value | Returned source data |
|---|---|---|
github | owner/repo | Releases, excluding drafts; first page only, up to 100 entries. |
github-tags | owner/repo | Tags ordered by SemVer, without dates or notes. |
npm | Package name, including scopes | Registry versions and publication dates. |
pypi | Project name | Versions and publication dates, excluding fully yanked releases. |
crates | Crate name | Versions and publication dates, excluding yanked releases. |
feed | Public HTTPS URL | RSS 2.0, RSS 1.0 or Atom entries. |
changelog | Public HTTPS URL | Version headings in HTML, Markdown or plain text. |
Strings use kind:value, such as github:sindresorhus/ky.
Objects contain exactly one kind key and optional sinceDate, sinceVersion or selector:
{"targets": [{"pypi":"django","sinceVersion":"5.0"},{"changelog":"https://www.sqlite.org/changes.html","sinceDate":"2026-01-01"}],"limit": 5}
Per-target sinceDate or sinceVersion overrides the batch date. Supplying both fails that target.
A bare date means after that whole UTC day. Date-times require Z or a timezone offset.
A day-only release that straddles a timestamp boundary is excluded and counted in sinceSkipped.
Undated entries also count in sinceSkipped; use sinceVersion for GitHub tags.
sinceVersion accepts up to 100 characters and compares strictly greater versions.
PyPI uses PEP 440; other kinds use strict SemVer 2.0. Unorderable release versions count in sinceSkipped.
selector accepts up to 200 characters and scopes HTML changelogs only.
Caller URLs allow up to 2,048 characters and must use public HTTPS on port 443 without embedded credentials.
See the .actor/input_schema.json for the Actor contract.
Pricing
One Release costs $0.0018 and counts one delivered release row, including cached output. Failed targets, zero-release summaries and withheld releases incur no Release events.
Identical normalized targets with identical options merge within one run. Different filters or selectors are separate targets and can return and charge the same release again.
One thousand Release events cost $1.80, plus $0.00005 per run start at default memory. The one-release example costs $0.00185 including startup. The default nine-release example costs up to $0.01625. Default memory is 128 MB. Apify counts one start event per GB of memory, with a minimum of one event. The $0.00005 run start at default memory applies even with no billable releases.
The Actor uses remaining charge capacity to select rows before delivery.
Read OUTPUT for withheld counts; raise the budget to receive more matches.
Limits and data freshness
- A run accepts 500 targets, fetches eight concurrently and gives each target a 20-second upstream budget.
- GitHub reads at most 100 entries from one page. Feeds expose a window and always report
truncated. - Response limits are 5 MiB for caller URLs, 10 MiB for GitHub and 24 MiB for registries.
- Changelog extraction needs version headings; dates must appear as
YYYY-MM-DDin the heading. Atom XHTML content is not read. - Feed and changelog requests honor robots.txt, block private addresses and recheck up to three redirects. No browser or runtime LLM runs.
Parsed public snapshots are fresh for five minutes, then revalidated when requested.
fetchedAt marks the last upstream fetch or HTTP 304 confirmation; cache hits retain that time.
The named store release-watch-cache persists across runs without automatic pruning.
Responses fetched with githubToken are never cached.
The synchronous API waits up to 300 seconds. For larger batches, use asynchronous runs.
If a row fails
| Status | Next step |
|---|---|
invalid_target, invalid_since | Correct the target kind, object options or date/version format. |
not_found, forbidden | Check the project or URL and public access. |
rate_limited | Honor error.retryAfter seconds when present; retry later. |
unsafe_url, robots_disallowed, robots_unavailable | Use an accessible public HTTPS source that permits retrieval. GitHub Atom feeds may require the github kind instead. |
selector_not_found, no_releases_detected, unsupported_content | Check the HTML selector, version headings and content format. |
response_too_large, parse_error | Read error.message; the source exceeds limits or has an unsupported response shape. |
timeout, network_error, upstream_error | Retry later or split the batch. |
internal_error | Report the target and error message. |
Explicit empty targets, a non-object input or an invalid batch limit fail the run before target processing.