# GitHub Release Monitor — Releases & Tags Scraper (`taroyamada/github-release-monitor`) Actor

GitHub release monitor: track public repo releases and tags. Charged only for new/changed rows. No API key / no login. Open Input → leave defaults → Start: https://console.apify.com/actors/PBJosf7CDQZ2qrKNQ/input From $0.008 per new/changed row.

- **URL**: https://apify.com/taroyamada/github-release-monitor.md
- **Developed by:** [naoki anzai](https://apify.com/taroyamada) (community)
- **Categories:** Developer tools, Automation, News
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 delivered monitoring result rows

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GitHub Release & Changelog Monitor API

**What you get:** one row per repository with a status (`initial`, `changed`, …), severity, executive summary, recommended actions, the latest release/tag markers, and per-surface changes for the releases feed, tags, and changelog.

Sample output from real runs (2026-10-18, first run with a new `snapshotKey`):

| repo | status | severity | latest release marker | surfaces |
|---|---|---|---|---|
| apify/crawlee | initial | watch | v4.0.0-rc.1 | releases, tags |
| axios/axios | initial | watch | v0.34.0 | releases, tags, changelog |

The first run writes one `initial` row per repository ($0.008 each). After that, with `datasetMode: changes_only`, only repositories with a new release, tag, or changelog change get a row; with no change the run writes 0 rows and charges nothing.

[Open Input (leave defaults → Start)](https://console.apify.com/actors/PBJosf7CDQZ2qrKNQ/input)
Paid first-run JSON ≈ **USD 0.008** (1 repository → 1 `initial` row on the first run). Keep reports, exports, and movement options bounded for the first run. Open Console Input (deep link above) and run this JSON.

```json
{
  "repositories": [
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "high",
      "owner": "Platform",
      "tags": [
        "crawler"
      ],
      "modes": [
        "releases",
        "tags"
      ]
    }
  ],
  "requestTimeoutSeconds": 20,
  "maxChars": 10000,
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "notifyOnNoChange": false,
  "snapshotKey": "github-release-wave-n",
  "dryRun": false
}
```

Paste repository and Start.

Monitor software dependencies and automate your version tracking by scraping GitHub releases, tags, and changelogs. This web scraper is designed to keep engineering, security, and ops teams informed about critical updates without requiring them to manually check a website or conduct a tedious search for release notes. It automatically crawls GitHub repository pages to extract detailed, structured data on version bumps, deprecations, and new features directly from the source. Users typically schedule this tool to run on a daily or weekly basis to catch new releases across dozens of open-source repositories. By providing a simple list of GitHub URLs, you can extract results that seamlessly fit into your existing alerting stack. The actor is perfect for generating a webhook release digest, allowing you to route scraped release summaries directly to Slack, PagerDuty, or Opsgenie so your on-call team maintains full visibility over upstream changes. The scraped data provides everything you need for internal audits, compliance checks, and ticketing automation. Output details include specific fields such as `repoUrl`, `currentVersion`, `previousVersion`, `changelogSummary`, and `isDeprecated`. Ensure your software stack remains secure by keeping a constant pulse on the open-source community and tracking repository drift using reliable, automated data extraction.

### Store Quickstart

- Start with `store-input.example.json` for a reliable first run across two public repositories.
- If the output fits your workflow, switch to `store-input.templates.json` and choose one of:
  - `Quickstart (2 repos, dataset)` for first success
  - `Recurring Team Watchlist` for a recurring internal release watch lane
  - `Webhook Release Digest` when Slack, ticketing, or internal automation should receive only routed release summaries

### Use with Apify MCP

Exact actor: `taroyamada/github-release-monitor`

Sample input JSON:

```json
{
  "repositories": [
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "high",
      "owner": "Platform",
      "tags": [
        "crawler",
        "sdk"
      ],
      "modes": [
        "releases",
        "tags"
      ]
    }
  ],
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "notifyOnNoChange": false,
  "snapshotKey": "github-release-monitor-quickstart",
  "diffMode": "line_summary",
  "summaryMaxLines": 12,
  "concurrency": 2,
  "batchDelayMs": 250
}
```

### Key Features

- 🛠️ **Developer-focused** — CLI-ready JSON output for piping into build/CI tooling
- ⚡ **Fast parallel scanning** — Concurrent fetches with backoff for high-throughput audits
- 📊 **Changelog-aware** — Detects version bumps, new releases, and deprecations between runs
- 🔔 **Alert integrations** — Webhook delivery to Slack/PagerDuty/Opsgenie for on-call visibility
- 🔒 **Zero-credentials** — Uses only public data — no package-registry API keys required

### Use Cases

| Who | Why |
|-----|-----|
| Developers | Automate recurring data fetches without building custom scrapers |
| Data teams | Pipe structured output into analytics warehouses |
| Ops teams | Monitor changes via webhook alerts |
| Product managers | Track competitor/market signals without engineering time |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| repositories | array | prefilled | List of repositories to monitor. Each item supports id, name, repo, criticality, owner, tags, modes, releaseUrl, release |
| requestTimeoutSeconds | integer | `30` | HTTP request timeout per monitored source. |
| userAgent | string | — | Optional User-Agent header for upstream requests. |
| maxChars | integer | `35000` | Upper bound for extracted text per monitored source. |
| delivery | string | `"dataset"` | Where to send summary-first repository results. |
| datasetMode | string | `"changes_only"` | Choose every repository row, only changed rows, or only action-needed rows. |
| webhookUrl | string | — | Required when delivery is webhook. |
| notifyOnNoChange | boolean | `false` | When false, webhook delivery skips when there are no changed or action-needed repository summaries. |

#### Input Example

```json
{
  "repositories": [
    {
      "id": "axios",
      "name": "Axios",
      "repo": "axios/axios",
      "criticality": "high",
      "owner": "Platform",
      "tags": ["sdk", "http-client"],
      "modes": ["releases", "tags", "changelog"],
      "changelogUrl": "https://raw.githubusercontent.com/axios/axios/v1.x/CHANGELOG.md"
    },
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "standard",
      "owner": "Automation",
      "modes": ["releases", "tags"]
    }
  ],
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "snapshotKey": "github-release-monitor-team-watchlist",
  "diffMode": "line_summary",
  "summaryMaxLines": 12,
  "concurrency": 2
}
```

### Input Examples

#### Example: Single repo release watch

```json
{
  "repositories": [
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "high",
      "owner": "Platform",
      "tags": [
        "crawler"
      ],
      "modes": [
        "releases",
        "tags"
      ]
    }
  ],
  "datasetMode": "changes_only",
  "snapshotKey": "crawlee-releases"
}
```

#### Example: Portfolio recurring watch

```json
{
  "repositories": [
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "high",
      "owner": "Platform",
      "tags": [
        "crawler"
      ],
      "modes": [
        "releases",
        "tags"
      ]
    },
    {
      "id": "react",
      "name": "React",
      "repo": "facebook/react",
      "criticality": "standard",
      "modes": [
        "releases"
      ]
    }
  ],
  "datasetMode": "changes_only",
  "snapshotKey": "frontend-portfolio"
}
```

#### Example: Tags only

```json
{
  "repositories": [
    {
      "id": "vscode",
      "name": "VS Code",
      "repo": "microsoft/vscode",
      "criticality": "standard",
      "modes": [
        "tags"
      ]
    }
  ],
  "datasetMode": "all",
  "snapshotKey": "vscode-tags"
}
```

### Output

| Field | Type | Description |
|-------|------|-------------|
| `meta` | object |  |
| `recurringDigest` | object |  |
| `actionNeeded` | array |  |
| `results` | array |  |
| `actionNeeded[].repositoryId` | string |  |
| `actionNeeded[].repositoryName` | string |  |
| `actionNeeded[].repo` | string |  |
| `actionNeeded[].owner` | string |  |
| `actionNeeded[].severity` | string |  |
| `actionNeeded[].status` | string |  |
| `actionNeeded[].reason` | string |  |
| `actionNeeded[].changedSurfaces` | array |  |
| `actionNeeded[].signals` | array |  |
| `actionNeeded[].recommendedActions` | array |  |
| `actionNeeded[].executiveSummary` | string |  |

#### Output Example

```json
{
  "repositoryId": "axios",
  "repositoryName": "Axios",
  "repo": "axios/axios",
  "status": "changed",
  "severity": "high",
  "signals": ["action_required", "deprecation"],
  "recommendedActions": [
    "Review the latest GitHub release notes with Platform and decide whether upgrade, regression-test, or compatibility work is needed.",
    "Read the changelog diff and extract migration, configuration, or rollout work for Platform."
  ],
  "repositorySummary": {
    "changedSurfaces": ["releases", "changelog"],
    "actionNeeded": true
  }
}
```

### API Usage

Run this actor programmatically using the Apify API. Replace `YOUR_API_TOKEN` with your token from [Apify Console → Settings → Integrations](https://console.apify.com/account/integrations).

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/taroyamada~github-release-monitor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "repositories": [ { "id": "axios", "name": "Axios", "repo": "axios/axios", "criticality": "high", "owner": "Platform", "tags": ["sdk", "http-client"], "modes": ["releases", "tags", "changelog"], "changelogUrl": "https://raw.githubusercontent.com/axios/axios/v1.x/CHANGELOG.md" }, { "id": "apify-crawlee", "name": "Apify Crawlee", "repo": "apify/crawlee", "criticality": "standard", "owner": "Automation", "modes": ["releases", "tags"] } ], "delivery": "dataset", "datasetMode": "changes_only", "snapshotKey": "github-release-monitor-team-watchlist", "diffMode": "line_summary", "summaryMaxLines": 12, "concurrency": 2 }'
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/github-release-monitor").call(run_input={
  "repositories": [
    {
      "id": "axios",
      "name": "Axios",
      "repo": "axios/axios",
      "criticality": "high",
      "owner": "Platform",
      "tags": ["sdk", "http-client"],
      "modes": ["releases", "tags", "changelog"],
      "changelogUrl": "https://raw.githubusercontent.com/axios/axios/v1.x/CHANGELOG.md"
    },
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "standard",
      "owner": "Automation",
      "modes": ["releases", "tags"]
    }
  ],
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "snapshotKey": "github-release-monitor-team-watchlist",
  "diffMode": "line_summary",
  "summaryMaxLines": 12,
  "concurrency": 2
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### JavaScript / Node.js

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/github-release-monitor').call({
  "repositories": [
    {
      "id": "axios",
      "name": "Axios",
      "repo": "axios/axios",
      "criticality": "high",
      "owner": "Platform",
      "tags": ["sdk", "http-client"],
      "modes": ["releases", "tags", "changelog"],
      "changelogUrl": "https://raw.githubusercontent.com/axios/axios/v1.x/CHANGELOG.md"
    },
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "standard",
      "owner": "Automation",
      "modes": ["releases", "tags"]
    }
  ],
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "snapshotKey": "github-release-monitor-team-watchlist",
  "diffMode": "line_summary",
  "summaryMaxLines": 12,
  "concurrency": 2
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Tips & Limitations

- Run nightly as part of your supply-chain monitoring to catch new vulnerabilities early.
- Pair with `oss-vulnerability-monitor` for CVE coverage layered on top of version tracking.
- For monorepos, run per-package rather than recursing — easier to triage alerts by team owner.
- Use `snapshotKey` to persist between runs and only alert on diffs.
- Webhook delivery supports JSON payloads — pipe into your existing on-call routing.

### FAQ

**Is my build slowed down?**

This actor runs on Apify infrastructure, not your CI runners. No impact on build times.

**What's the freshness of data?**

Depends on the source registry — typically 5–60 minutes behind upstream.

**Can I filter by package ecosystem?**

Yes — most DevOps actors accept an ecosystem or package-manager filter in their input schema.

**Does this work with private registries?**

No — this actor targets public registries (npm, PyPI, crates.io, etc.). Private registries require credential handling that's out of scope.

**Can I integrate with GitHub Actions?**

Yes — call this actor via Apify API inside a workflow job, parse the JSON output, and fail the build on threshold violations.

### Related Actors

DevOps & Tech Intel cluster — explore related Apify tools:

- [🌐 DNS Propagation Checker](https://apify.com/taroyamada/dns-propagation-checker) — Check DNS propagation across 8 global resolvers (Google, Cloudflare, Quad9, OpenDNS).
- [🔍 Subdomain Finder](https://apify.com/taroyamada/subdomain-finder) — Discover subdomains for any domain using Certificate Transparency logs (crt.
- [🧹 CSV Data Cleaner](https://apify.com/taroyamada/csv-data-cleaner) — Clean CSV data: trim whitespace, remove empty rows, deduplicate by columns, sort.
- [📦 NPM Package Analyzer](https://apify.com/taroyamada/npm-package-intelligence) — Analyze npm packages: download stats, dependencies, licenses, deprecation status.
- [💬 Reddit Scraper](https://apify.com/taroyamada/reddit-data-scraper) — Scrape Reddit posts and comments from any subreddit via official JSON API.
- [Docs & Changelog Drift Monitor API](https://apify.com/taroyamada/docs-changelog-drift-monitor) — Monitor release notes, changelog pages, migration guides, and key docs pages with one summary-first target row per monitored repo, SDK, or product.
- [Tech Events Calendar API | Conferences + CFP](https://apify.com/taroyamada/tech-events-intelligence) — Aggregate tech conferences and CFPs across multiple sources into a deduplicated event calendar for DevRel and recruiting workflows.
- [🔒 OSS Vulnerability Monitor](https://apify.com/taroyamada/oss-vulnerability-monitor) — Monitor open-source packages for known security vulnerabilities using OSV and GitHub Security Advisories.

### Cost

**Failed repositories are not charged.** If every monitored source for a repository fails (the repository gets `status: "error"`), that repository is not written to the dataset, so it is not billed. It is saved in the run's key-value store record `FAILED_ROWS` (and in the `OUTPUT` record), and the run status message says how many repositories failed. Webhook delivery is unchanged.

**Pay Per Event**:

- `apify-default-dataset-item`: $0.008 per repository row (only new or changed repositories in `changes_only` mode)

**Example**: 10 repositories, first run = 10 rows = **$0.08**

No subscription required — you only pay for what you use.

### ⭐ Was this helpful?

If this actor saved you time, please [**leave a ★ rating**](https://apify.com/taroyamada/github-release-monitor/reviews) on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the [Issues tab](https://apify.com/taroyamada/github-release-monitor/issues) of this actor.

# Actor input Schema

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

Leave the prefilled Apify Crawlee and Axios repositories and click Start for the first release-monitor run. Or provide your own public GitHub repository watchlist.

## `requestTimeoutSeconds` (type: `integer`):

HTTP request timeout per monitored source.

## `userAgent` (type: `string`):

Optional User-Agent header for upstream requests.

## `maxChars` (type: `integer`):

Upper bound for extracted text per monitored source.

## `delivery` (type: `string`):

Where to send summary-first repository results.

## `datasetMode` (type: `string`):

Choose every repository row, only changed rows, or only action-needed rows.

## `webhookUrl` (type: `string`):

Required when delivery is webhook.

## `notifyOnNoChange` (type: `boolean`):

When false, webhook delivery skips when there are no changed or action-needed repository summaries.

## `snapshotKey` (type: `string`):

Key used for recurring snapshot persistence. Keep it stable so release and changelog drift stays comparable over time.

## `diffMode` (type: `string`):

Choose between line-level change summaries for reviewer context or hash-only detection when you only need alerting.

## `summaryMaxLines` (type: `integer`):

Maximum added and removed lines retained in each source change summary.

## `concurrency` (type: `integer`):

Maximum number of monitored sources processed in parallel.

## `batchDelayMs` (type: `integer`):

Delay between processing batches to reduce rate-limit pressure.

## `nowIso` (type: `string`):

Optional deterministic timestamp override.

## `dryRun` (type: `boolean`):

Skip snapshot persistence and side-effect delivery.

## Actor input object example

```json
{
  "repositories": [
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "high",
      "owner": "Platform",
      "tags": [
        "crawler",
        "sdk"
      ],
      "modes": [
        "releases",
        "tags"
      ]
    }
  ],
  "requestTimeoutSeconds": 30,
  "maxChars": 35000,
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "notifyOnNoChange": false,
  "snapshotKey": "github-release-monitor-snapshots",
  "diffMode": "line_summary",
  "summaryMaxLines": 12,
  "concurrency": 1,
  "batchDelayMs": 250,
  "dryRun": false
}
```

# Actor output Schema

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

Dataset containing all scraped 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 = {
    "repositories": [
        {
            "id": "apify-crawlee",
            "name": "Apify Crawlee",
            "repo": "apify/crawlee",
            "criticality": "high",
            "owner": "Platform",
            "tags": [
                "crawler",
                "sdk"
            ],
            "modes": [
                "releases",
                "tags"
            ]
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/github-release-monitor").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 = { "repositories": [{
            "id": "apify-crawlee",
            "name": "Apify Crawlee",
            "repo": "apify/crawlee",
            "criticality": "high",
            "owner": "Platform",
            "tags": [
                "crawler",
                "sdk",
            ],
            "modes": [
                "releases",
                "tags",
            ],
        }] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/github-release-monitor").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 '{
  "repositories": [
    {
      "id": "apify-crawlee",
      "name": "Apify Crawlee",
      "repo": "apify/crawlee",
      "criticality": "high",
      "owner": "Platform",
      "tags": [
        "crawler",
        "sdk"
      ],
      "modes": [
        "releases",
        "tags"
      ]
    }
  ]
}' |
apify call taroyamada/github-release-monitor --silent --output-dataset

```

## MCP server setup

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

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/PBJosf7CDQZ2qrKNQ/builds/SEsvog7yFcdGKFyoD/openapi.json
