# GitHub Release (`maximedupre/github-releases`) Actor

Analyze public GitHub releases or supplied release records. Get structured data for tags, notes, assets, dates, download counts, repository context, version movement, and risk signals. Compare current and earlier sets to find new or changed notes and assets.

- **URL**: https://apify.com/maximedupre/github-releases.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Developer tools, Automation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.01 / 1,000 releases

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🚀 GitHub release change signals for developers

Developers, maintainers, and security teams can compare public GitHub releases or supplied release records in one run. Get structured rows with release tags, notes, assets, dates, authors, repository context, comparisons, version movement, risk signals, and a short change brief so important updates are easier to review.

**Use cases**

- Read [**GitHub release notes**](https://apify.com/maximedupre/github-releases/examples/github-release-notes) and flag terms worth review.
- Review [**GitHub release stats**](https://apify.com/maximedupre/github-releases/examples/github-release-stats) such as repository stars and asset download counts.
- Compare [**GitHub release tags**](https://apify.com/maximedupre/github-releases/examples/github-release-tags) to see which versions are present.
- Check [**GitHub releases download count**](https://apify.com/maximedupre/github-releases/examples/github-releases-download-count) values for attached files.
- Use [**GitHub releases API**](https://apify.com/maximedupre/github-releases/examples/github-releases-api) data as structured release rows.
- Check a [**GitHub release date**](https://apify.com/maximedupre/github-releases/examples/github-release-date) before reviewing a version.

#### 📦 Release data you can review

Each matching release becomes one structured dataset row. Rows can include the repository, release tag, release page, publication times, notes, author, status, attached assets, and source links. Repository runs can also include stars, the default branch, and the latest commit time.

When you provide an earlier release set, the row shows whether the release is new, changed, unchanged, or not compared. It can list changed note terms and asset names, classify semantic-version movement, flag built-in or watchlist signals, score importance, and add a short change brief. The signals are based on source fields, version comparisons, and matching terms; they are not a claim of deeper semantic understanding.

#### ▶️ Compare releases in one run

1. Choose `Repository releases` to read public GitHub release data, or choose `Supplied release data` to compare JSON records without fetching GitHub.
2. For repository releases, enter one or more public repositories in `owner/name` form. For supplied data, add the current release records.
3. Add filters for release history, prereleases, drafts, dates, risk signals, watchlist keywords, and unchanged releases. Add `previousReleaseRecords` when you want a comparison.
4. Run the Actor and open the `dataset` output. If a public release source has a reading problem, open the `diagnostics` output.

Repository mode uses public GitHub access and does not need a GitHub token. Private repositories, commits, pull requests, and non-GitHub release sources are outside this Actor's scope.

#### ⚙️ Input

Choose one `target`. It is required, and fields for the other target are ignored. Only `target` is required; the other fields are optional.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | Select | Choose `Repository releases` or `Supplied release data`. |
| `repositories` | String list | In repository mode, enter one or more public GitHub repositories in `owner/name` form. Use a separate run for a different release-monitoring setup. |
| `releaseHistoryLimit` | Integer | Sets how many recent releases to inspect per repository. Leave it empty to return all available results until the source is exhausted. |
| `currentReleaseRecords` | JSON object list | In supplied mode, provide current release records without fetching GitHub. Each item should have an identity such as `tag_name` or `id`; fields such as `assets` may be nested. Use UTC for time values. |
| `includePrereleases` | Boolean | Includes prerelease releases in the results when on. |
| `includeDrafts` | Boolean | In supplied mode, includes records marked as drafts. It has no effect in repository mode because public GitHub listings expose published releases only. |
| `publishedFrom` | UTC date string | Limits analysis to releases published on or after this UTC date. Leave it empty to use all available history. |
| `onlyFlagged` | Boolean | Returns only releases with a detected risk or watchlist signal. |
| `watchKeywords` | String list | Flags words or phrases in release notes. Matching is case-insensitive. |
| `previousReleaseRecords` | JSON object list | Optionally provides the earlier JSON release set for comparison. Repository mode uses the earlier repository set; supplied mode uses the same record shape as `currentReleaseRecords`. |
| `changeScope` | Select | Chooses only new releases, or new releases plus changed notes or assets. |
| `includeUnchanged` | Boolean | Includes releases with no changes in snapshot or comparison results. |

**Input example**

This example is copied from a successful current-beta repository run:

```json
{
  "target": "repository-releases",
  "repositories": [
    "microsoft/vscode"
  ],
  "releaseHistoryLimit": 10,
  "includePrereleases": false,
  "includeDrafts": false,
  "onlyFlagged": false,
  "changeScope": "new-and-changed",
  "includeUnchanged": true
}
```

#### 🧾 Output

The `dataset` output links to the structured release rows. The `diagnostics` output links to a key-value record with problems found while reading public GitHub release data.

**Run outputs**

- `dataset` — Opens the dataset items in the `overview` view.
- `diagnostics` — Opens source diagnostics in the default key-value store.

**Dataset row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `repository` | Object | Repository that published the release. |
| `repository.name` | String | GitHub repository name in `owner/name` form. |
| `repository.url` | URL | Link to the GitHub repository. |
| `repository.stars` | Integer | Number of GitHub stars, when the source provides it. |
| `repository.defaultBranch` | String | Name of the default branch, when the source provides it. |
| `repository.latestCommitAt` | Date-time string | Time of the latest commit on the default branch, when known. |
| `release` | Object | Release details and attached files. |
| `release.id` | Integer | GitHub release ID, when the source provides it. |
| `release.tagName` | String | Git tag that identifies the release. |
| `release.name` | String | Name shown for the release, when provided. |
| `release.url` | URL | Link to the release page on GitHub. |
| `release.publishedAt` | Date-time string | Time when the release was published, when known. |
| `release.updatedAt` | Date-time string | Time when the release record was last changed, when known. |
| `release.notes` | String | Release notes published with the release. |
| `release.author` | Object | GitHub user who created the release, when known. |
| `release.author.login` | String | GitHub login of the release author. |
| `release.author.url` | URL | Link to the author's GitHub profile. |
| `release.status` | Object | Publication state and prerelease flag. |
| `release.status.state` | String | Release state: `draft` or `published`. |
| `release.status.isPrerelease` | Boolean | Whether GitHub marks the release as a prerelease. |
| `release.assets` | Array | Files attached to the release. |
| `release.assets[]` | Object | One file attached to the release. |
| `release.assets[].name` | String | Name of the attached file. |
| `release.assets[].downloadUrl` | URL | Direct download link, when available. |
| `release.assets[].sizeBytes` | Integer | File size in bytes. |
| `release.assets[].contentType` | String | Media type reported for the file. |
| `release.assets[].downloadCount` | Integer | Number of downloads reported for the file. |
| `release.assets[].updatedAt` | Date-time string | Time when the file record was last changed, when known. |
| `comparison` | Object | Changes found against the earlier release record, when one was supplied. |
| `comparison.status` | String | Comparison state: `new`, `changed`, `unchanged`, or `not-compared`. |
| `comparison.notesChanged` | Boolean | Whether the release notes differ from the earlier record. |
| `comparison.notesTermsAdded` | String list | Words or phrases in the new notes but not the earlier notes. |
| `comparison.notesTermsRemoved` | String list | Words or phrases in the earlier notes but not the new notes. |
| `comparison.assetsChanged` | Boolean | Whether the release assets differ from the earlier record. |
| `comparison.assetChanges` | Object | Asset names and counts from the comparison. |
| `comparison.assetChanges.addedNames` | String list | Names of files added since the earlier record. |
| `comparison.assetChanges.removedNames` | String list | Names of files removed since the earlier record. |
| `comparison.assetChanges.changedNames` | String list | Names of files whose details changed since the earlier record. |
| `comparison.assetChanges.previousCount` | Integer | Number of files in the earlier record, when supplied. |
| `semanticVersion` | Object | Semantic-version values and movement between release records. |
| `semanticVersion.current` | String | Normalized semantic version for this release, when valid. |
| `semanticVersion.previous` | String | Normalized semantic version from the earlier record, when valid. |
| `semanticVersion.movement` | String | Version movement: `major`, `minor`, `patch`, `prerelease`, `build`, `none`, `unknown`, or `not-compared`. |
| `risk` | Object | Risk and watchlist signals found in the release notes. |
| `risk.hasRisk` | Boolean | Whether a breaking-change, security, or watchlist signal was found. |
| `risk.signals` | String list | Built-in signals found in the notes: `breaking-change` or `security`. |
| `risk.matchedKeywords` | String list | Buyer keywords found in the release notes. |
| `importance` | Object | Score and reasons that help rank releases for review. |
| `importance.score` | Integer | Release importance score from 0 to 100. |
| `importance.level` | String | Importance level: `low`, `medium`, or `high`. |
| `importance.reasons` | String list | Evidence used to set the importance score. |
| `summary` | Object | Short view of release themes, cadence, position, and value. |
| `summary.themes` | String list | Main themes found in the release notes. |
| `summary.cadence` | String | Plain-language summary of the repository's release cadence. |
| `summary.positioning` | String | What role the release plays in the product or repository. |
| `summary.whyItMatters` | String | Why a user may want to review the release. |
| `changeBrief` | String | Plain-language brief of the release and its changes. |

**Example changed release row**

This genuine row comes from a successful current-beta supplied-release-data run. It shows a changed major release with a security signal, a watchlist match, and asset changes.

```json
{
  "repository": {
    "name": "example/widget",
    "url": "https://github.com/example/widget"
  },
  "release": {
    "tagName": "v2.0.0",
    "url": "https://github.com/example/widget/releases/tag/v2.0.0",
    "notes": "Security fix and breaking change",
    "status": {
      "state": "published",
      "isPrerelease": false
    },
    "assets": [
      {
        "name": "release.tar.gz",
        "downloadUrl": "https://github.com/example/widget/releases/download/v2.0.0/release.tar.gz",
        "sizeBytes": 42,
        "contentType": "application/gzip",
        "downloadCount": 3,
        "updatedAt": "2026-08-01T12:31:00Z"
      }
    ],
    "id": 200,
    "name": "Release 2.0.0",
    "publishedAt": "2026-08-01T12:00:00Z",
    "updatedAt": "2026-08-01T12:30:00Z",
    "author": {
      "login": "release-bot",
      "url": "https://github.com/release-bot"
    }
  },
  "comparison": {
    "status": "changed",
    "notesChanged": true,
    "notesTermsAdded": [
      "and",
      "breaking",
      "change",
      "fix",
      "security"
    ],
    "notesTermsRemoved": [
      "maintenance"
    ],
    "assetsChanged": true,
    "assetChanges": {
      "addedNames": [
        "release.tar.gz"
      ],
      "removedNames": [
        "old.tar.gz"
      ],
      "changedNames": [],
      "previousCount": 2
    }
  },
  "semanticVersion": {
    "current": "2.0.0",
    "previous": "1.9.0",
    "movement": "major"
  },
  "risk": {
    "hasRisk": true,
    "signals": [
      "breaking-change",
      "security"
    ],
    "matchedKeywords": [
      "security"
    ]
  },
  "importance": {
    "score": 100,
    "level": "high",
    "reasons": [
      "release notes or assets changed",
      "major version movement",
      "release assets changed",
      "breaking-change signal",
      "security signal",
      "watchlist keyword matched"
    ]
  },
  "summary": {
    "themes": [
      "breaking changes",
      "security",
      "bug fixes"
    ],
    "cadence": "Not enough release history to estimate cadence.",
    "positioning": "A major release with broad version movement.",
    "whyItMatters": "Review this release because its notes contain a risk or watchlist signal."
  },
  "changeBrief": "Release 2.0.0 has changed since the prior snapshot. Its semantic version movement is major. Risk or watchlist signals were found in the notes. Main themes: breaking changes, security, bug fixes."
}
```

#### 💳 Pricing

**Charge event**

You pay $0.00001 for each successfully returned GitHub release. Empty runs, source diagnostics, and setup work do not create this event because it is tied to a successfully returned release.

#### 🔌 Integrations

Start runs from the Apify Console or API. Read `dataset` rows through the Apify Dataset API, use `diagnostics` when a public source has a reading problem, and export the dataset in standard Apify formats for your own workflow.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I compare a new release with an earlier release set?

Yes. Add `previousReleaseRecords`. In `Repository releases`, it is the earlier repository set; in `Supplied release data`, use the same record shape as the current records. Set `changeScope` to `new-and-changed` to include changed notes or assets.

##### Can I read public GitHub releases without a token?

Yes. `Repository releases` uses public GitHub release data and does not need a GitHub token. `Supplied release data` compares the JSON you provide and does not fetch GitHub.

##### Can I include prereleases or draft releases?

Turn on `includePrereleases` to include prereleases. `includeDrafts` applies to supplied records; it has no effect on repository releases because public GitHub listings expose published releases only.

##### Can I flag my own words in release notes?

Yes. Add words or phrases to `watchKeywords`. Matching is case-insensitive. Turn on `onlyFlagged` to return releases with a built-in risk or watchlist signal.

##### Does the Actor show changed release notes and assets?

Yes. With an earlier release set, comparison fields show whether notes or assets changed, the added or removed note terms, and changed asset names and counts.

##### Does it return asset download counts and repository stats?

When the source provides them, asset rows include `downloadCount`, and repository data can include `stars`, `defaultBranch`, and `latestCommitAt`.

##### Does it send alerts or keep a baseline?

Runs are on demand. The Actor does not promise a scheduler, proactive alerts, or automatic baseline retention. Pass `previousReleaseRecords` when you want a comparison.

##### What happens when a public release source has a problem?

The run exposes source problems through the `diagnostics` key-value output. A filter can also leave the dataset with no matching release rows.

##### Does it analyze commits, pull requests, or private repositories?

No. It focuses on public GitHub release data. Commit history, pull requests, private repositories, and non-GitHub release sources are outside its scope.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~github-releases/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [GitHub Security Advisories Scraper](https://apify.com/maximedupre/github-security-advisories-scraper) — Pair release reviews with published GitHub Security Advisory data.
- [Semver Parser & Version Range Checker](https://apify.com/maximedupre/semver-parser-version-range-checker) — Parse release tags and check version ranges before an upgrade.
- [GitHub Release Intelligence](https://apify.com/junipr/github-release-intelligence) — Summarize release changes, breaking changes, and semantic-version jumps.
- [GitHub Release Risk Monitor](https://apify.com/lynchest/tr-github-release-collector) — Flag breaking changes, security fixes, migrations, and custom release-note keywords.
- [GitHub Releases Delta Monitor](https://apify.com/tom_the_builder/github-releases-delta-monitor) — Find new or changed releases and return normalized release alerts.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose what to analyze.

## `repositories` (type: `array`):

Enter one or more public GitHub repositories in owner/name form. Use a separate run for a different release-monitoring setup.

## `releaseHistoryLimit` (type: `integer`):

Set how many recent releases to inspect per repository. Leave it empty to return all available results until the source is exhausted.

## `currentReleaseRecords` (type: `array`):

For the Supplied release data Target, provide a JSON array of release records without fetching GitHub. Each item should include a release identity such as tag\_name or id; source fields such as assets may be nested. Use UTC for time values, such as published\_at ending in Z. Example: \[{"tag\_name":"v1.2.0","name":"Release 1.2.0","body":"Fixes","published\_at":"2024-01-10T12:00:00Z","assets":\[]}].

## `includePrereleases` (type: `boolean`):

Include prerelease releases in the results. When off, they are left out.

## `includeDrafts` (type: `boolean`):

For the Supplied release data Target, include records marked as drafts. Repository releases use public GitHub listings, which show published releases only, so this setting has no effect there. When off, supplied draft records are left out.

## `publishedFrom` (type: `string`):

Only analyze releases published on or after this UTC date. Leave it empty to use all available history.

## `onlyFlagged` (type: `boolean`):

Return only releases with a detected risk or watchlist signal.

## `watchKeywords` (type: `array`):

Enter words or phrases to flag in release notes. Matching is case-insensitive.

## `previousReleaseRecords` (type: `array`):

Optionally provide the previous JSON release set for comparison. For Repository releases, use the earlier set; for Supplied release data, use the same record shape as Current release records. Source fields such as assets may be nested. Use UTC for time values, such as published\_at ending in Z. Example: \[{"tag\_name":"v1.1.0","name":"Release 1.1.0","body":"Fixes","published\_at":"2024-01-01T12:00:00Z","assets":\[]}].

## `changeScope` (type: `string`):

Choose whether comparison results include only new releases or new releases plus changed notes or assets.

## `includeUnchanged` (type: `boolean`):

Include releases with no changes in snapshot or comparison results.

## Actor input object example

```json
{
  "target": "repository-releases",
  "repositories": [
    "apify/apify-cli",
    "openai/openai-python"
  ],
  "releaseHistoryLimit": 10,
  "currentReleaseRecords": [
    {
      "tag_name": "v1.2.0",
      "name": "Release 1.2.0",
      "body": "Fixes",
      "published_at": "2024-01-10T12:00:00Z",
      "assets": []
    }
  ],
  "includePrereleases": false,
  "includeDrafts": false,
  "publishedFrom": "2025-01-01",
  "onlyFlagged": false,
  "watchKeywords": [
    "breaking change",
    "security"
  ],
  "previousReleaseRecords": [
    {
      "tag_name": "v1.1.0",
      "name": "Release 1.1.0",
      "body": "Fixes",
      "published_at": "2024-01-01T12:00:00Z",
      "assets": []
    }
  ],
  "changeScope": "new-and-changed",
  "includeUnchanged": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

One structured row for each matching GitHub release.

## `diagnostics` (type: `string`):

Key-value record with source problems found while reading public GitHub release data.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "target": "repository-releases",
    "repositories": [
        "microsoft/vscode"
    ],
    "releaseHistoryLimit": 10,
    "currentReleaseRecords": [
        {
            "tag_name": "v1.2.0",
            "name": "Release 1.2.0",
            "body": "Fixes",
            "published_at": "2024-01-10T12:00:00Z",
            "assets": []
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/github-releases").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "target": "repository-releases",
    "repositories": ["microsoft/vscode"],
    "releaseHistoryLimit": 10,
    "currentReleaseRecords": [{
            "tag_name": "v1.2.0",
            "name": "Release 1.2.0",
            "body": "Fixes",
            "published_at": "2024-01-10T12:00:00Z",
            "assets": [],
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/github-releases").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "target": "repository-releases",
  "repositories": [
    "microsoft/vscode"
  ],
  "releaseHistoryLimit": 10,
  "currentReleaseRecords": [
    {
      "tag_name": "v1.2.0",
      "name": "Release 1.2.0",
      "body": "Fixes",
      "published_at": "2024-01-10T12:00:00Z",
      "assets": []
    }
  ]
}' |
apify call maximedupre/github-releases --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/github-releases"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/rlDPKfFu8z90OYN9r/builds/h2y0UBc5MztmXFs0x/openapi.json
